type not none python comparison nonetype

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