Operadores de comparación preferidos de Python

Se prefiere hacer:

if x is y: return True 

o

 if x == y return True 

Lo mismo para “no es”

x is y es diferente de x == y .

x is y es verdadero si y solo si id(x) == id(y) , es decir, y deben ser uno y el mismo objeto (con la misma id s).

Para todos los objetos Python incorporados (como cadenas, listas, dicts, funciones, etc.), si x is y , entonces x == y también es True. Sin embargo, esto no está garantizado en general. Estrictamente hablando, x == y es verdadero si y solo si x.__eq__(y) devuelve Verdadero.

Es posible definir un objeto x con un método __eq__ que siempre devuelve False, por ejemplo, y esto haría que x == y devuelva False, incluso si x is y .

Entonces, la conclusión es que x is y y x == y son pruebas completamente diferentes.

Considera esto por ejemplo:

 In [1]: 0 is False Out[1]: False In [2]: 0 == False Out[2]: True 

PD. En lugar de

 if x is y: return True else: return False 

es más pythonico escribir

 return x is y 

Y de manera similar,

 if x == y: return True else: return False 

puede ser reemplazado con

 return x == y 

x is y compara las identidades de los dos objetos, y pregunta “¿son x y y nombres diferentes para el mismo objeto?” Es equivalente a id(x) == id(y) .

x == y usa el operador de igualdad y hace la pregunta más flexible “¿son x y y iguales?” Para los tipos definidos por el usuario es equivalente a x.__eq__(y) .

El método especial __eq__ debe representar ‘igualdad’ para los objetos, por ejemplo, una clase que representa fracciones querría que 1/2 sea igual a 2/4, aunque el objeto ‘una mitad’ no pueda tener la misma identidad que ‘dos ​​cuartos ‘objeto.

Tenga en cuenta que no solo es el caso que a == b no implica que a is b , sino que lo contrario es cierto. Uno no es en general un requisito más estricto que el otro. Sí, esto significa que puede tener a == a retorno False si realmente quiere, por ejemplo:

 >>> a = float('nan') >>> a is a True >>> a == a False 

En la práctica, aunque is casi siempre una comparación más específica que == .

  • == y != son operadores de comparación de valores de objetos
  • is y is not son operadores de comparación de identidad de objetos

como ya han dicho otros, is (y is not ) solo cuando realmente te importa que un par de variables se refieran exactamente al mismo objeto. en la mayoría de los casos, realmente no te importa en absoluto, por lo que utilizarías == y != .

sin embargo, lo que puede comenzar a notar, si observa una gran cantidad de código de Python, es que is más probable que se use (y is not ) cuando se compara con True , False y None . La razón principal de esto es que esos objetos son singletons, lo que significa que hay exactamente una instancia de cada uno de esos valores. ¿Por que importa? Bueno, esto lleva a otra razón … la velocidad.

con == y != , el intérprete debe extraer ambos objetos referidos para hacer una comparación (de si son iguales o no), mientras que is y is not simplemente verificar los valores de los objetos que están refiriéndose a. con esto dicho, puedes ver que el último par funcionará más rápido porque no tienes que buscar los objetos para hacer la comparación. Esta es una prueba de velocidad de un par de años atrás, en la que llegamos a la conclusión de que, para una sola vez, no es un gran problema, pero si se llama un millón de veces en un circuito cerrado, bueno, comenzará a acumularse.

http://mail.python.org/pipermail/tutor/2008-June/062708.html

La conclusión es que puede usar comparaciones de identidad de objetos para verificar contra True , False y None , y todo lo demás debería usar operadores de igualdad directa. no entraremos en enteros internados ni en métodos de instancia vinculados, ni nada de eso aquí. 🙂

Depende. is y is not hace comparación de identidades, lo que es bueno para None , Ellipsis , o asegurarse de que dos objetos sean iguales. De lo contrario, utilice == o != .