Wat is het verschil tussen “is Geen” en “== Geen”

Ik kwam onlangs deze syntaxis tegen, ik ken het verschil niet.

Ik zou het op prijs stellen als iemand me het verschil zou kunnen vertellen.


Antwoord 1, autoriteit 100%

Het antwoord wordt hieruitgelegd.

Om te citeren:

Een klasse is gratis te implementeren
vergelijking op welke manier dan ook, en het
kan ervoor kiezen om een vergelijking te maken met
Geen betekent iets (wat eigenlijk
klinkt logisch; als iemand je dat zou zeggen
implementeer het object Geen van
krassen, hoe zou je het anders krijgen?
vergelijk True met zichzelf?).

Praktisch gesproken is er niet veel verschil, aangezien aangepaste vergelijkingsoperatoren zeldzaam zijn. Maar u moet als algemene regel is Nonegebruiken.


Antwoord 2, autoriteit 50%

class Foo:
    def __eq__(self,other):
        return True
foo=Foo()
print(foo==None)
# True
print(foo is None)
# False

Antwoord 3, autoriteit 16%

In dit geval zijn ze hetzelfde. Noneis een singleton-object (er bestaat maar één None).

iscontroleert of het object hetzelfde object is, terwijl == alleen controleert of ze equivalent zijn.

Bijvoorbeeld:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

Maar aangezien er maar één Noneis, zullen ze altijd hetzelfde zijn, en iszal True retourneren.

p = None
q = None
p is q # True because they are both pointing to the same "None"

Antwoord 4, autoriteit 6%

Het hangt af van wat je vergelijkt met Geen. Sommige klassen hebben aangepaste vergelijkingsmethoden die == Noneanders behandelen dan is None.

In het bijzonder de uitvoer van a == Nonehoeft niet eens booleaans te zijn!!– een veel voorkomende oorzaak van bugs.

Neem voor een specifiek voorbeeld een numpy-array waarbij de ==vergelijking elementsgewijs wordt geïmplementeerd:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False

Antwoord 5

Als je numpy gebruikt,

if np.zeros(3)==None: pass

geeft u een foutmelding wanneer numpy een elementgewijze vergelijking maakt

Other episodes