2010-07-15 58 views
186

Recentemente ho sono imbattuto in questa sintassi, non sono a conoscenza della differenza.Qual è la differenza tra "è Nessuno" e "== Nessuno"

Sarei grato se qualcuno potesse dire la differenza.

+2

Sede [C'è una differenza tra il '==' e 'is' in Python?] (http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python/134659#134659) –

+0

@ myusuf3: si potrebbe desiderare di pensare di cambiare la risposta accettata al correggi uno. – max

risposta

177

La risposta è spiegata here.

Per citare:

Una classe è libera di implementare confronto alcun modo sceglie, e può scegliere di fare il confronto contro Nessuno significa qualcosa (che in realtà ha un senso, se qualcuno ti ha detto al implementare l'oggetto Nessuno dal zero, in quale altro modo si potrebbe farlo confronto vero contro se stesso?).

In pratica, non c'è molta differenza dal momento che gli operatori di confronto personalizzato sono rari. Ma dovresti usare is None come regola generale.

+0

Questa è stata una lettura interessante (e breve). E alcune informazioni utili su 'is' v.' == '. –

+17

Inoltre, 'è None' è un bit (~ 50%) più veloce di' == None' :) –

+0

@NasBanov hai un link a dove lo hai letto? – myusuf3

38

In questo caso, essi sono uguali. None è un oggetto singleton (esiste sempre solo uno None).

is controlla se l'oggetto è lo stesso oggetto, mentre == controlla solo se sono equivalenti.

Ad esempio:

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

Ma dal momento che solo una None c'è, saranno sempre gli stessi, e is restituirà true.

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

Questa risposta non è corretta, come spiegato nella risposta di Ben Hoffstein sotto http://stackoverflow.com/questions/3257919/is-none-vs-none/3257957#3257957. 'x == None' può valutare 'True' anche se' x' non è 'None' ma un'istanza di qualche classe con il proprio operatore di uguaglianza personalizzato. – max

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

print(foo==None) 
# True 

print(foo is None) 
# False 
3

Se si utilizza NumPy,

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

vi darà errore quando NumPy fa confronto elementwise