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 ...
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.
@ 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.
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
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 == Noneni 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 isNone#compares object to object, outputs False
==
yis
en python?is
vs==
, o sobre la naturaleza de lo queNone
es 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 ...Respuestas:
La respuesta se explica aquí .
Citar:
En términos prácticos, no hay mucha diferencia ya que los operadores de comparación personalizados son raros. Pero debes usar
is None
como regla general.fuente
is None
es un poco (~ 50%) más rápido que== None
:)is
es, básicamente, una comparación de enteros mientras==
que no solo resuelve referencias sino que compara valores que pueden tener tipos que no coinciden.fuente
En este caso, son lo mismo.
None
es un objeto singleton (solo existe unoNone
).is
comprueba si el objeto es el mismo objeto, mientras que == solo comprueba si son equivalentes.Por ejemplo:
Pero como solo hay uno
None
, siempre serán los mismos yis
devolverán True.fuente
x == None
puede evaluarTrue
incluso six
no esNone
una instancia de alguna clase con su propio operador de igualdad personalizado.Si usas numpy,
le dará un error cuando numpy hace una comparación de elementos
fuente
Depende de lo que esté comparando con Ninguno. Algunas clases tienen métodos de comparación personalizados que se tratan de manera
== None
diferenteis 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:fuente