¿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.



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.


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

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"

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.