¿Cuál es la diferencia entre "is None" y "== None"

324

Recientemente me encontré con esta sintaxis, no soy consciente de la diferencia.

Agradecería que alguien me dijera la diferencia.

myusuf3
fuente
1
¿Responde esto a tu pregunta? ¿Hay alguna diferencia entre "==" y "es"?
junio
No está claro si esta pregunta es sobre isvs ==, o sobre la naturaleza de lo que Nonees exactamente y cómo el comportamiento difiere en cualquier contexto (este último es el motivo por el que terminé aquí). Basado en la vaguedad y la falta de respuestas de OP ... Me sorprende que esto tenga tantos votos positivos. Quiero decir ... vamos ... la pregunta ni siquiera está escrita en la pregunta real ...
RTbecard

Respuestas:

291

La respuesta se explica aquí .

Citar:

Una clase es libre de implementar la comparación de cualquier forma que elija, y puede optar por hacer que la comparación con None signifique algo (lo que en realidad tiene sentido; si alguien le dijera que implemente el objeto None desde cero, ¿de qué otra manera lo haría comparar? contra sí mismo?

En términos prácticos, no hay mucha diferencia ya que los operadores de comparación personalizados son raros. Pero debes usar is Nonecomo regla general.

Ben Hoffstein
fuente
57
Además, is Nonees un poco (~ 50%) más rápido que == None:)
Nas Banov
26
@ myusuf3: >>> timeit.Timer ('Ninguno es Ninguno'). timeit () | 0,225 | >>> timeit.Timer ('Ninguno == Ninguno'). timeit () | 0.328
Nas Banov
99
@ myusuf3 Realmente no necesitas una prueba para eso. ises, básicamente, una comparación de enteros mientras ==que no solo resuelve referencias sino que compara valores que pueden tener tipos que no coinciden.
Pijusn
44
Uno a favor de "es". Cuando una variable puede ser None o algo que no tiene una comparación significativa con None. Por ejemplo, una variable puede ser numpy.array o None (mi caso particular).
Jblasco
3
Me gustaría agregar a lo que dice @TimLudwinski: primero, si alguien elige anular el operador de igualdad para que None sea un caso especial, ¿por qué deberíamos decirle lo contrario? Segundo, "debería haber una, y preferiblemente solo una, forma obvia de hacerlo". Y la forma obvia de verificar si algo es igual a algo es, bueno, el operador de igualdad.
Yuval
162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False
unutbu
fuente
56

En este caso, son lo mismo. Nonees un objeto singleton (solo existe uno None).

is comprueba si el objeto es el mismo objeto, mientras que == solo comprueba si son equivalentes.

Por ejemplo:

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

Pero como solo hay uno None, siempre serán los mismos y isdevolverán True.

p = None
q = None
p is q # True because they are both pointing to the same "None"
Donald Miner
fuente
17
Esta respuesta no es correcta, como se explica en la respuesta de Ben Hoffstein a continuación stackoverflow.com/questions/3257919/is-none-vs-none/… . x == Nonepuede evaluar Trueincluso si xno es Noneuna instancia de alguna clase con su propio operador de igualdad personalizado.
máximo
5

Si usas numpy,

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

le dará un error cuando numpy hace una comparación de elementos

jf328
fuente
3

Depende de lo que esté comparando con Ninguno. Algunas clases tienen métodos de comparación personalizados que se tratan de manera == Nonediferente is None.

¡En particular, la salida de a == None ni siquiera tiene que ser booleana! - una causa frecuente de errores.

Para un ejemplo específico, tome una matriz numpy donde la ==comparación se implementa por elementos:

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
PGlivi
fuente