Es ist unklar, ob es bei dieser Frage um isvs ==geht oder um die Art dessen, was genau Noneist und wie sich das Verhalten in beiden Kontexten unterscheidet (letzteres ist der Grund, warum ich hier gelandet bin). Aufgrund der Unbestimmtheit und des Mangels an OP-Antworten ... bin ich überrascht, dass dies so viele positive Stimmen hat. Ich meine ... cmon ... die Frage ist nicht einmal in der eigentlichen Frage geschrieben ...
Es steht einer Klasse frei, Vergleiche nach Belieben zu implementieren, und sie kann festlegen, dass Vergleiche mit None etwas bedeuten (was tatsächlich Sinn macht; wenn Ihnen jemand sagt, dass Sie das None-Objekt von Grund auf neu implementieren sollen, wie würden Sie es sonst dazu bringen, True zu vergleichen gegen sich selbst?).
In der Praxis gibt es keinen großen Unterschied, da benutzerdefinierte Vergleichsoperatoren selten sind. Aber Sie sollten in der is NoneRegel verwenden.
@ myusuf3 Dafür brauchst du eigentlich keinen Beweis. isist im Grunde ein ganzzahliger Vergleich, bei dem ==nicht nur Referenzen aufgelöst werden, sondern auch Werte verglichen werden, die möglicherweise nicht übereinstimmende Typen aufweisen.
Pijusn
4
Einer für "ist". Wenn eine Variable entweder None oder etwas sein kann, das keinen aussagekräftigen Vergleich mit None hat. Zum Beispiel kann eine Variable ein numpy.array oder None sein (mein spezieller Fall).
Jblasco
3
Ich möchte hinzufügen, was @TimLudwinski sagt: Wenn jemand den Gleichheitsoperator überschreiben möchte, um None zu einem Sonderfall zu machen, warum sollten wir ihm dann etwas anderes sagen? Zweitens: "Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun." Und der offensichtliche Weg, um zu überprüfen, ob etwas gleich etwas ist, ist der Gleichheitsoperator.
Diese Antwort ist nicht korrekt, wie in Ben Hoffsteins Antwort unter stackoverflow.com/questions/3257919/is-none-vs-none/… erläutert . x == Nonekann Trueauch dann auswerten, wenn xes sich Nonenur um eine Instanz einer Klasse mit einem eigenen benutzerdefinierten Gleichheitsoperator handelt.
Max
5
Wenn Sie numpy verwenden,
if np.zeros(3)==None:pass
gibt einen Fehler aus, wenn numpy einen elementweisen Vergleich durchführt
Es hängt davon ab, was Sie mit None vergleichen. Einige Klassen verfügen über benutzerdefinierte Vergleichsmethoden, die == Noneanders behandelt werden als is None.
Insbesondere muss die Ausgabe von a == Nonenicht einmal boolesch sein !! - eine häufige Ursache für Fehler.
Nehmen Sie für ein bestimmtes Beispiel ein Numpy-Array, in dem der ==Vergleich elementweise implementiert wird:
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 isNone#compares object to object, outputs False
==
undis
in Python?is
vs==
geht oder um die Art dessen, was genauNone
ist und wie sich das Verhalten in beiden Kontexten unterscheidet (letzteres ist der Grund, warum ich hier gelandet bin). Aufgrund der Unbestimmtheit und des Mangels an OP-Antworten ... bin ich überrascht, dass dies so viele positive Stimmen hat. Ich meine ... cmon ... die Frage ist nicht einmal in der eigentlichen Frage geschrieben ...Antworten:
Die Antwort wird hier erklärt .
Zitieren:
In der Praxis gibt es keinen großen Unterschied, da benutzerdefinierte Vergleichsoperatoren selten sind. Aber Sie sollten in der
is None
Regel verwenden.quelle
is None
ist ein bisschen (~ 50%) schneller als== None
:)is
ist im Grunde ein ganzzahliger Vergleich, bei dem==
nicht nur Referenzen aufgelöst werden, sondern auch Werte verglichen werden, die möglicherweise nicht übereinstimmende Typen aufweisen.quelle
In diesem Fall sind sie gleich.
None
ist ein Singleton-Objekt (es gibt immer nur einesNone
).is
prüft, ob das Objekt dasselbe Objekt ist, während == nur prüft, ob sie gleichwertig sind.Zum Beispiel:
Aber da es nur einen gibt
None
, werden sie immer gleich sein undis
True zurückgeben.quelle
x == None
kannTrue
auch dann auswerten, wennx
es sichNone
nur um eine Instanz einer Klasse mit einem eigenen benutzerdefinierten Gleichheitsoperator handelt.Wenn Sie numpy verwenden,
gibt einen Fehler aus, wenn numpy einen elementweisen Vergleich durchführt
quelle
Es hängt davon ab, was Sie mit None vergleichen. Einige Klassen verfügen über benutzerdefinierte Vergleichsmethoden, die
== None
anders behandelt werden alsis None
.Insbesondere muss die Ausgabe von
a == None
nicht einmal boolesch sein !! - eine häufige Ursache für Fehler.Nehmen Sie für ein bestimmtes Beispiel ein Numpy-Array, in dem der
==
Vergleich elementweise implementiert wird:quelle