Comparación de cadenas en Python: es vs. ==

Noté que una secuencia de comandos de Python que estaba escribiendo estaba actuando de forma squirrelly, y lo rastreé hasta un bucle infinito, donde la condición del bucle era while line is not '' . Al ejecutarlo en el depurador, resultó que esa línea era, de hecho, '' . Cuando lo cambié a !='' lugar de is not '' , funcionó bien.

Además, ¿generalmente se considera mejor simplemente usar ‘==’ por defecto, incluso cuando se comparan valores int o booleanos? Siempre me ha gustado usar ‘is’ porque me parece más estético y python (que es como caí en esta trampa …), pero me pregunto si está destinado a ser reservado cuando te importa encontrar dos. Objetos con la misma id.

Para todos los objetos Python incorporados (como cadenas, listas, dicts, funciones, etc.), si x es y, entonces x == y también es True.

No siempre. NaN es un contraejemplo. Pero generalmente , la identidad ( is ) implica igualdad ( == ). Lo contrario no es cierto: dos objetos distintos pueden tener el mismo valor.

Además, ¿generalmente se considera mejor simplemente usar ‘==’ por defecto, incluso cuando se comparan valores int o booleanos?

Se usa == cuando se comparan valores y is cuando se comparan identidades.

Cuando se comparan ints (o tipos inmutables en general), casi siempre se desean los primeros. Hay una optimización que permite comparar los enteros pequeños con, pero no confíe en ella.

Para los valores booleanos, no debería hacer comparaciones en absoluto. En lugar de:

 if x == True: # do something 

escribir:

 if x: # do something 

Para comparar con None , se prefiere == None sobre == None .

Siempre me ha gustado usar ‘is’ porque me parece más estético y python (que es como caí en esta trampa …), pero me pregunto si está destinado a ser reservado cuando te importa encontrar dos. Objetos con la misma id.

Sí, para eso es exactamente.

Me gustaría mostrar un pequeño ejemplo de cómo y == están involucrados en tipos inmutables. Trata eso:

 a = 19998989890 b = 19998989889 +1 >>> a is b False >>> a == b True 

is compara dos objetos en la memoria, == compara sus valores. Por ejemplo, puede ver que Python almacena en caché los enteros pequeños:

 c = 1 b = 1 >>> b is c True 

Debe usar == al comparar valores y is al comparar identidades. (Además, desde un punto de vista en inglés, “es igual a” es diferente de “es”.)

La lógica no es defectuosa. La statement

si x es y, entonces x == y también es verdadero

nunca debe ser leído para significar

si x == y entonces x es y

Es un error lógico por parte del lector suponer que lo contrario de una statement lógica es verdadero. Ver http://en.wikipedia.org/wiki/Converse_(logic)

Ver esta pregunta

Tu logica en la lectura

Para todos los objetos Python incorporados (como cadenas, listas, dicts, funciones, etc.), si x es y, entonces x == y también es True.

es un poco defectuoso

Si is aplica, entonces == será verdadero, pero NO se aplica a la inversa. == puede dar verdadero mientras que is falso.