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

Me di cuenta de que un script de Python que estaba escribiendo se comportaba de forma extraña, y lo rastreé hasta un bucle infinito, donde la condición del bucle era mientras la línea no es ''. Al revisarlo en el depurador, resultó que esa línea era de hecho ''. Cuando la cambié por !='' en lugar de no es '', funcionó bien.

Además, ¿se considera generalmente mejor utilizar simplemente '==' por defecto, incluso cuando se comparan valores int o booleanos? A mí siempre me ha gustado usar 'is' porque me parece más estético y pitónico (que es como he caído en esta trampa...), pero me pregunto si se pretende reservarlo sólo para cuando te interesa encontrar dos objetos con el mismo id.

Solución

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

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

Además, ¿se considera generalmente mejor usar simplemente '==' por defecto, incluso

cuando se comparan valores int o booleanos?

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

Cuando se comparan ints (o tipos inmutables en general), casi siempre se quiere lo primero. Existe una optimización que permite comparar enteros pequeños con is, 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 contra None, se prefiere is None a == None.

Siempre me ha gustado usar "is" porque

Me parece más agradable estéticamente y pitónico (que es como he caído en esta trampa...), pero me pregunto si es destinado a ser reservado sólo para cuando te importa encontrar dos objetos con el mismo id.

Sí, eso es exactamente lo que it's para.

Comentarios (18)

Me gustaría mostrar un pequeño ejemplo sobre cómo es y == están involucrados en los tipos inmutables. Inténtalo:

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

is compara dos objetos en memoria, == compara sus valores. Por ejemplo, puedes ver que los enteros pequeños son almacenados en caché por Python:

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

Deberías usar == cuando comparas valores y is cuando comparas identidades. (Además, desde el punto de vista del inglés, "equals" es diferente de "is").

Comentarios (4)

Ver Esta pregunta

Su lógica en la lectura

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

es ligeramente defectuoso.

Si es se aplica entonces == será Verdadero, pero NO se aplica a la inversa. == puede dar True mientras que is da False.

Comentarios (2)