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
==yisen python?isvs==, o sobre la naturaleza de lo queNonees 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 Nonecomo regla general.fuente
is Nonees un poco (~ 50%) más rápido que== None:)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.fuente
En este caso, son lo mismo.
Nonees un objeto singleton (solo existe unoNone).iscomprueba 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 yisdevolverán True.fuente
x == Nonepuede evaluarTrueincluso sixno esNoneuna 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
== Nonediferenteis 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:fuente