Gibt es einen Unterschied zwischen "foo ist kein" und "foo = = "None"?

StackOverflow https://stackoverflow.com/questions/26595

  •  09-06-2019
  •  | 
  •  

Frage

Gibt es einen Unterschied zwischen:

if foo is None: pass

und

if foo == None: pass

Die Konvention, dass die, die ich gesehen habe in den meisten Python-code (und der code, den ich selbst schreiben) ist die ehemalige, aber vor kurzem stieß ich auf code, der verwendet den letzteren.Keiner ist eine Instanz (und die einzige Instanz, IIRC) of NoneType, so sollte es keine Rolle, richtig?Gibt es irgendwelche Umstände, unter denen es vielleicht?

War es hilfreich?

Lösung

is immer wieder True wenn es vergleicht die gleiche Objekt-Instanz

In der Erwägung, dass == ist letztlich bestimmt durch die __eq__() Methode

d.h.


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False

Andere Tipps

Möchten Sie vielleicht, um diese zu Lesen Objekt Identität und äquivalenz.

Die Aussage 'ist' ist verwendet für Objekt-Identität prüft, ob Objekte beziehen sich auf die gleiche Instanz (gleiche Adresse im Speicher).

Und '= = ' - Anweisung bezieht sich auf die Gleichheit (gleicher Wert).

Ein Wort der Vorsicht:

if foo:
  # do something

Ist nicht genau das gleiche wie:

if x is not None:
  # do something

Ersteres ist ein boolescher Wert, der test und können zu false ausgewertet, die in anderen Kontexten.Es gibt eine Reihe von Dingen, die Sie vertreten false, einen boolean-Wert-tests für B. leere Container, boolean-Werte.None wird auch als false ausgewertet wird, in dieser situation, aber andere Dinge zu tun.

(ob1 is ob2) gleich (id(ob1) == id(ob2))

Der Grund foo is None es ist der bevorzugte Weg ist, dass Sie vielleicht im Umgang mit einem Objekt, das definiert, seine eigenen __eq__, und definiert das Objekt gleich sein Keine.Also, immer verwenden foo is None wenn Sie brauchen, um zu sehen, ob es ist infact None.

Es gibt keinen Unterschied, weil Objekte, die identisch sind, werden natürlich gleich.Jedoch, PEP 8 klar, die Sie verwenden sollten is:

Vergleiche singletons wie Keine, sollte immer durchgeführt werden, mit ist oder nicht, nie die gleichheitsoperatoren.

is tests zur Identität, nicht Gleichheit.Für Ihre Aussage foo is none, Python-einfach vergleicht die Speicher Adresse von Objekten.Es bedeutet, dass Sie die Frage "ich habe zwei Namen für das gleiche Objekt?"

== auf der anderen Seite tests für die Gleichheit, bestimmt durch die __eq__() Methode.Es muss nicht sorgen über Identität.

In [102]: x, y, z = 2, 2, 2.0

In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)

In [104]: x is y
Out[104]: True

In [105]: x == y
Out[105]: True

In [106]: x is z
Out[106]: False

In [107]: x == z
Out[107]: True

None ist eine singleton-Betreiber.So None is None ist immer wahr.

In [101]: None is None
Out[101]: True

Denn Niemand sollte es kein Unterschied zwischen Gleichheit (==) und Identität (ist).Die NoneType wahrscheinlich gibt Identität für die Gleichstellung.Da Keiner ist der einzige Instanz, die Sie machen kann, um NoneType (ich denke, das ist wahr), die beiden Operationen sind die gleichen.Bei anderen Typen ist dies nicht immer der Fall.Zum Beispiel:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

Diese würden print "Gleich" da Listen haben einen Vergleich Vorgang, ist nicht die Standard der Rückkehr der Identität.

@Jason:

Ich empfehle, mit etwas mehr entlang der Linien von

if foo:
    #foo isn't None
else:
    #foo is None

Ich mag es nicht verwenden ", wenn foo:" es sei denn, foo wirklich repräsentiert einen booleschen Wert (d.h.0 oder 1).Falls foo ein string oder ein Objekt oder etwas anderes, "wenn foo:" kann funktionieren, aber es sieht aus wie ein fauler Verknüpfung zu mir.Wenn Sie überprüfen, um zu sehen, wenn x Keine, sagen: "wenn x Keine:".

Einige weitere details:

  1. Die is Klausel tatsächlich überprüft, ob die beiden objects sind in der gleichen Speicher Speicherort oder nicht.ich.e, ob Sie beide auf das gleiche Speicher Speicherort und die gleiche id.

  2. Als Folge 1, is sorgt dafür, ob oder nicht, die beiden lexikalisch dargestellt objects identische Attribute (attributes-of-Attribute,...) oder nicht

  3. Instanziierung von primitiven Typen wie bool, int, string(mit einigen Ausnahme), NoneType mit einem gleichen Wert immer in der gleichen Speicherstelle.

E. g.

>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True

Und da NoneType kann nur eine Instanz von sich selbst in der python - "look-up" - Tabelle ist deshalb die erstere und letztere sind von Programmiersprachen und-Stil von der Entwickler haben den code geschrieben(vielleicht für Konsistenz), anstatt dann irgendwelche subtilen logischen Grund, wählen Sie eine über die andere.

John Machin ist der Schluss, dass None ein singleton ist eine Schlussfolgerung gestärkt durch diesen code.

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

Da None ein singleton ist, x == None und x is None würde das gleiche Ergebnis.Jedoch, in meinem ästhetische Meinung, x == None am besten ist.

a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top