not - Python Ninguna comparación: ¿debería usar "es" o==?
nonetype python (3)
Resumen:
El uso is
cuando desea verificar la identidad de un objeto (por ejemplo, verificar si var
es None
). Use ==
cuando quiera verificar la igualdad (p. Ej., ¿ var
es igual a 3
?).
Explicación:
Puede tener clases personalizadas donde my_var == None
devolverá True
p.ej:
class Negator(object):
def __eq__(self,other):
return not other
thing = Negator()
print thing == None #True
print thing is None #False
is
cheques para la identidad del objeto. Solo hay 1 objeto None
, por lo que cuando lo haces my_var is None
, estás comprobando si realmente son el mismo objeto (no solo objetos equivalentes )
En otras palabras, ==
es una verificación de equivalencia (que se define de un objeto a otro) mientras que is
verifica la identidad del objeto:
lst = [1,2,3]
lst == lst[:] # This is True since the lists are "equivalent"
lst is lst[:] # This is False since they''re actually different objects
Posible duplicado:
¿Cuándo el operador `==` no es equivalente al operador `is`? (Pitón)
Estoy usando Python 2.x.
Mi editor me da un subrayado de ''advertencia'' cuando comparo my_var == None
, pero ninguna advertencia cuando uso my_var is None
.
Hice una prueba en el shell Python y determiné que ambas son sintaxis válidas, pero mi editor parece decir que my_var is None
es el preferido.
Es este el caso, y si es así, ¿por qué?
PEP 8 define que es mejor usar el operador is
al comparar singletons.
generalmente se prefiere cuando se comparan objetos arbitrarios con singletons como None
porque es más rápido y más predecible. siempre se compara por identidad de objeto, mientras que lo que hará ==
depende 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
or is not
, never the equality operators".