Qual è la differenza tra "is None" e "== None"


324

Di recente mi sono imbattuto in questa sintassi, non sono consapevole della differenza.

Gradirei se qualcuno potesse dirmi la differenza.



1
Questo risponde alla tua domanda? C'è una differenza tra "==" e "is"?
giugno

Non è chiaro se questa domanda riguardi isvs ==, o sulla natura di cosa sia esattamente Nonee come il comportamento differisca in entrambi i contesti (quest'ultimo è il motivo per cui sono finito qui). Sulla base della vaghezza e della mancanza di risposte OP ... sono sorpreso che questo abbia così tanti voti positivi. Voglio dire ... cmon ... la domanda non è nemmeno scritta nella domanda reale ...
RTbecard

Risposte:


291

La risposta è spiegata qui .

Per citare:

Una classe è libera di implementare il confronto nel modo che preferisce, e può scegliere di fare un confronto con Nessuno significa qualcosa (che in realtà ha senso; se qualcuno ti dicesse di implementare l'oggetto Nessuno da zero, in quale altro modo potresti farlo confrontare contro se stesso?).

In pratica, non c'è molta differenza poiché gli operatori di confronto personalizzati sono rari. Ma dovresti usare is Nonecome regola generale.


57
Inoltre, is Noneè un po 'più veloce (~ 50%) di == None:)
Nas Banov,

26
@ myusuf3: >>> timeit.Timer ('Nessuno è nessuno'). timeit () | 0,225 | >>> timeit.Timer ('Nessuno == Nessuno'). timeit () | 0.328
Nas Banov,

9
@ myusuf3 Non hai davvero bisogno di una prova per questo. isè, fondamentalmente, il confronto di numeri interi mentre ==non si tratta solo di risolvere riferimenti ma di confrontare valori che possono avere tipi non corrispondenti.
Pijusn,

4
Uno a favore di "è". Quando una variabile può essere Nessuna o qualcosa che non ha un confronto significativo con Nessuna. Ad esempio, una variabile può essere numpy.array o None (il mio caso particolare).
Jblasco,

3
Vorrei aggiungere a ciò che @TimLudwinski sta dicendo: in primo luogo, se qualcuno ha scelto di ignorare l'operatore di uguaglianza per trasformare None in un caso speciale, perché dovremmo dirgli diversamente? In secondo luogo, "Dovrebbe esserci uno - e preferibilmente solo un - modo oscuro di farlo". E il modo ovvio per verificare se qualcosa è uguale a qualcosa è, beh, l'operatore di uguaglianza.
Yuval,

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

print(foo==None)
# True

print(foo is None)
# False

56

In questo caso, sono gli stessi. Noneè un oggetto singleton (ne esiste solo uno None).

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

Per 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 ce n'è solo uno None, saranno sempre gli stessi e isrestituiranno True.

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

17
Questa risposta non è corretta, come spiegato nella risposta di Ben Hoffstein sotto stackoverflow.com/questions/3257919/is-none-vs-none/... . x == Nonepuò valutare Trueanche se xnon è Noneche un'istanza di una classe con il proprio operatore di uguaglianza personalizzato.
max

5

Se usi numpy,

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

ti darà errore quando numpy fa un confronto elementally


3

Dipende da cosa stai confrontando con Nessuno. Alcune classi hanno metodi di confronto personalizzati che trattano == Nonediversamente da is None.

In particolare l'output di a == None non deve nemmeno essere booleano !! - una causa frequente di bug.

Per un esempio specifico, prendere un array numpy in cui il ==confronto è implementato elementally:

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 is None #compares object to object, outputs False
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.