Mi editor me advierte cuando comparo my_var == None
, pero no me avisa cuando lo uso my_var is None
.
Hice una prueba en el shell de Python y determiné que ambas son una sintaxis válida, pero mi editor parece estar diciendo que my_var is None
es preferible.
¿Es este el caso, y si es así, por qué?
python
comparison
nonetype
Clay Wardell
fuente
fuente
is
- python.org/dev/peps/pep-0008/#programming-recommendationsRespuestas:
Resumen:
Úselo
is
cuando desee verificar la identidad de un objeto (por ejemplo, verificar sivar
es asíNone
). Úselo==
cuando desee verificar la igualdad (por ejemplo, esvar
igual a3
?).Explicación:
Puede tener clases personalizadas donde
my_var == None
volveráTrue
p.ej:
is
comprueba la identidad del objeto . Solo hay 1 objetoNone
, así que cuando lo hacesmy_var is None
, estás verificando si realmente son el mismo objeto (no solo equivalente objetos )En otras palabras,
==
es una verificación de equivalencia (que se define de un objeto a otro) mientras queis
verifica la identidad del objeto:fuente
is None
difiere de== None
?__eq__
se puede definir de cualquier manera, pero el comportamiento deis
no se puede cambiar tan fácilmente.is
". Después de un comentario en las listas, cambió eso a "... inclusois
(pero solo si estás loco)".object == None
realmente sea el idioma correcto (aunque no puedo pensar en ninguno fuera de mi cabeza). Solo necesitas saber lo que estás haciendo.is
generalmente se prefiere cuando se comparan objetos arbitrarios con singletons comoNone
porque es más rápido y más predecible.is
siempre se compara por identidad de objeto, mientras que lo==
que hará dependerá del tipo exacto de los operandos e incluso de su orden.Esta recomendación es respaldada por PEP 8 , que establece explícitamente que "las comparaciones con singletons como None siempre deben hacerse con
is
ois not
, nunca, los operadores de igualdad".fuente
None
objeto debajo de la constante globalNone
. En todo caso,NoneType
es un detalle de implementación porque elNone
singleton debe tener algún tipo. (El hecho de que no pueda crear instancias de este tipo es una buena indicación de que su única instancia está destinada a ser un singleton.)None
, utilice todos los mediosobj == None
. Si desea verificar si un objeto esNone
, useobj is None
. El punto de la recomendación de PEP 8 (y de esta respuesta) es que la mayoría de las personas quieren este último cuando quieren verificar Ninguno, y también resulta ser más rápido y más claro.None
También es diferente de los objetos en caché como0
y otros enteros pequeños, donde el almacenamiento en caché es realmente un detalle de implementación. La diferencia es que un número entero tiene un valor intrínseco que le da sus propiedades y puede calcularse. Por otro lado,None
no tiene ningún tipo de estado, es solo su identidad lo que importa y lo hace especial.PEP 8 define que es mejor usar el
is
operador al comparar singletons.fuente