2010-07-15 5 views
186

Hace poco encontré esta sintaxis, no estoy al tanto de la diferencia.Cuál es la diferencia entre "is None" y "== None"

Agradecería que alguien pudiera decirme la diferencia.

+2

Ver [¿Hay una diferencia entre == '' y 'is' en Python?] (http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python/134659#134659) –

+0

@ myusuf3: es posible que desee considerar cambiar la respuesta aceptada al Corriga uno. – max

Respuesta

177

La respuesta se explica here.

Para citar:

Una clase es libre de implementar comparación manera que desee, y puede optar por hacer la comparación con Ninguno significa algo (que en realidad tiene sentido; si alguien le dijera para implementar el objeto Ninguno desde cero, ¿de qué otro modo lo conseguiría hasta comparar Verdadero contra sí mismo?).

Hablando en términos prácticos, no hay mucha diferencia ya que los operadores de comparación personalizados son raros. Pero debe usar is None como regla general.

+0

Esa fue una lectura interesante (y corta). Y algo de información útil en 'is' v.' == '. –

+17

Además, 'is None' es un poco (~ 50%) más rápido que' == None' :) –

+0

@NasBanov ¿tiene un enlace al lugar donde lo lee? – myusuf3

38

En este caso, son lo mismo. None es un objeto singleton (solo existe uno None).

is comprueba si el objeto es el mismo objeto, mientras que == simplemente verifica si son equivalentes.

Por ejemplo:

p = [1] 
q = [1] 
p is q # False because they are not the same actual object 
p == q # True because they are equivalent 

Pero ya que sólo hay una None, siempre van a ser los mismos, y is devolverá true.

p = None 
q = None 
p is q # True because they are both pointing to the same "None" 
+14

Esta respuesta no es correcta, como se explica en la respuesta de Ben Hoffstein debajo de http://stackoverflow.com/questions/3257919/is-none-vs-none/3257957#3257957. 'x == None' puede evaluar a' True' incluso si 'x' no es' None', sino una instancia de alguna clase con su propio operador de igualdad personalizado. – max

91
class Foo: 
    def __eq__(self,other): 
     return True 
foo=Foo() 

print(foo==None) 
# True 

print(foo is None) 
# False 
3

Si utiliza numpy,

if np.zeros(3)==None: pass 

te dará error al numpy hace la comparación elementwise

Cuestiones relacionadas