Mein Editor warnt mich beim Vergleichen my_var == None
, aber keine Warnung bei der Verwendung my_var is None
.
Ich habe einen Test in der Python-Shell durchgeführt und festgestellt, dass beide eine gültige Syntax sind, aber mein Editor scheint zu sagen, dass dies my_var is None
bevorzugt wird.
Ist dies der Fall und wenn ja, warum?
python
comparison
nonetype
Clay Wardell
quelle
quelle
is
- python.org/dev/peps/pep-0008/#programming-recommendationsAntworten:
Zusammenfassung:
Verwenden
is
Sie diese Option, wenn Sie die Identität eines Objekts überprüfen möchten (z. B. prüfen, ob dies der Fallvar
istNone
). Verwenden==
Sie diese Option, wenn Sie die Gleichheit überprüfen möchten (z. B. Istvar
gleich3
?).Erläuterung:
Sie können benutzerdefinierte Klassen haben, in die zurückgegeben
my_var == None
wirdTrue
z.B:
is
Kontrollen für die Objektidentität . Es gibt nur 1 ObjektNone
. Wenn Sie dies tunmy_var is None
, prüfen Sie, ob es sich tatsächlich um dasselbe Objekt handelt (nicht nur um gleichwertige Objekte).Mit anderen Worten, es
==
handelt sich um eine Prüfung auf Äquivalenz (die von Objekt zu Objekt definiert wird), währendis
auf Objektidentität geprüft wird:quelle
is None
sich von== None
?__eq__
kann auf irgendeine Weise definiert werden, aber das Verhalten vonis
kann nicht so einfach geändert werden.is
". Nach einem Kommentar zu den Listen änderte er dies in "... sogaris
(aber nur, wenn Sie verrückt sind)."object == None
eigentlich ist das richtige Idiom (obwohl ich nicht von jedem aus der Spitze von meinem Kopf denken kann). Sie müssen nur wissen, was Sie tun.is
wird im Allgemeinen bevorzugt, wenn beliebige Objekte mit Singletons verglichen werden,None
da dies schneller und vorhersehbarer ist.is
vergleicht immer nach Objektidentität, während das, was zu==
tun ist, vom genauen Typ der Operanden und sogar von ihrer Reihenfolge abhängt.Diese Empfehlung wird von PEP 8 unterstützt , in dem ausdrücklich festgelegt wird, dass "Vergleiche mit Singletons wie None immer mit
is
oderis not
niemals mit den Gleichheitsoperatoren durchgeführt werden sollten".quelle
None
unter der globalen Konstante nur ein ObjektNone
. Wenn überhaupt, dasNoneType
ist eine Implementierung Detail , weil dieNone
Singleton haben muss etwas Art. (Die Tatsache, dass Sie keine Instanzen dieses Typs erstellen können, ist ein guter Hinweis darauf, dass die eine Instanz ein Singleton sein soll.)None
, mit allen Mitteln verwendenobj == None
. Wenn Sie überprüfen möchten, ob es sich um ein Objekt handeltNone
, verwenden Sieobj is None
. Der Sinn der PEP 8-Empfehlung (und dieser Antwort) ist, dass die meisten Leute Letzteres wollen, wenn sie nach Keine suchen wollen, und es ist auch schneller und klarer.None
unterscheidet sich auch von zwischengespeicherten Objekten wie0
und anderen kleinen Ganzzahlen, bei denen das Caching wirklich ein Implementierungsdetail ist. Der Unterschied besteht darin, dass eine Ganzzahl einen inneren Wert hat, der ihre Eigenschaften angibt und berechnet werden kann. Auf der anderen SeiteNone
hat es überhaupt keinen Zustand, es ist nur seine Identität , die zählt und es zu etwas Besonderem macht.PEP 8 definiert, dass es besser ist, den
is
Operator beim Vergleichen von Singletons zu verwenden.quelle