2010-07-15 30 views
186

ich auf diese Syntax vor kurzem kam, bin ich der Unterschied nicht bewusst.Was ist der Unterschied zwischen „ist None“ und „== None“

Ich würde es begrüßen, wenn jemand mir sagen, den Unterschied könnte.

+2

See [Gibt es einen Unterschied zwischen '==' und 'is' in Python?] (http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python/134659#134659) –

+0

@ myusuf3: Sie könnten auf die in Erwägung ziehen, die akzeptierte Antwort zu ändern richtig eins. – max

Antwort

177

Die Antwort wird here erklärt.

zu zitieren:

Eine Klasse ist frei Vergleich eine Möglichkeit, es wählt zu implementieren, und es kann Vergleich gegen Keine etwas bedeuten (die eigentlich Sinn machen wählen, macht, wenn jemand dir gesagt zu das keine Objekt aus Grund auf neu zu implementieren, wie sonst würden Sie es bekommen Vergleich wahr gegen sich selbst?).

Praktisch gesprochen gibt es keinen großen Unterschied, da benutzerdefinierte Vergleichsoperatoren selten sind. Aber Sie sollten is None als allgemeine Regel verwenden.

+0

Das war eine interessante (und kurze) Lektüre. Und einige nützliche Informationen in das 'is' v.' == '. –

+17

Außerdem ist 'is None' ein bisschen (~ 50%) schneller als' == None' :) –

+0

@NasBanov hast du einen Link dorthin, wo du das gelesen hast? – myusuf3

38

In diesem Fall sind sie gleich. None ist ein Singleton-Objekt (es existiert immer nur ein None).

is überprüft, ob das Objekt das gleiche Objekt, während == prüft nur, wenn sie gleichwertig sind.

Zum Beispiel:

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

Aber da es nur ein None ist, wird sie immer gleich sein, und is wird wieder wahr.

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

Diese Antwort ist nicht korrekt, wie in Ben Hoffsteins Antwort unter http://stackoverflow.com/questions/3257919/is-none-vs-none/3257957#3257957 erklärt. "x == None" kann zu "True" ausgewertet werden, auch wenn "x" nicht "None" ist, sondern eine Instanz einer Klasse mit einem eigenen benutzerdefinierten Gleichheitsoperator. – max

91
class Foo: 
    def __eq__(self,other): 
     return True 
foo=Foo() 

print(foo==None) 
# True 

print(foo is None) 
# False 
3

Wenn Sie numpy verwenden,

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

geben Sie Fehler, wenn numpy tut element Vergleich

Verwandte Themen