Comparación de cadenas en Python: is vs. == [duplicado]
Noté que un script de Python que estaba escribiendo actuaba de forma ardilla y lo rastreé hasta un bucle infinito, donde la condición del bucle era while line is not ''
. Al revisarlo en el depurador, resultó que la línea era, de hecho ''
, . Cuando lo cambié a !=''
en lugar de is not ''
, funcionó bien.
Además, ¿en general se considera mejor usar '==' de forma predeterminada, incluso al comparar valores int o booleanos? Siempre me ha gustado usar 'es' porque lo encuentro más agradable estéticamente y pitónico (que es como caí en esta trampa...), pero me pregunto si está destinado a reservarse solo para cuando te preocupas por encontrar dos objetos con la misma identificación.
Para todos los objetos integrados de Python (como cadenas, listas, dictados, funciones, etc.), si x es y, entonces x==y también es Verdadero.
No siempre. NaN es un contraejemplo. Pero normalmente , identidad ( is
) implica igualdad ( ==
). Lo contrario no es cierto: dos objetos distintos pueden tener el mismo valor.
Además, ¿en general se considera mejor usar '==' de forma predeterminada, incluso al comparar valores int o booleanos?
Se utiliza ==
al comparar valores y is
al comparar identidades.
Al comparar enteros (o tipos inmutables en general), casi siempre querrás lo primero. Hay una optimización que permite comparar números enteros pequeños con is
, pero no confíes en ella.
Para valores booleanos, no deberías hacer ninguna comparación. En lugar de:
if x == True:
# do something
escribir:
if x:
# do something
Para comparar con None
, is None
se prefiere a == None
.
Siempre me ha gustado usar 'es' porque lo encuentro más agradable estéticamente y pitónico (que es como caí en esta trampa...), pero me pregunto si está destinado a reservarse solo para cuando te preocupas por encontrar dos objetos con la misma identificación.
Sí, para eso es exactamente.
Me gustaría mostrar un pequeño ejemplo de cómo is
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 utilizarlo ==
al comparar valores y is
al comparar identidades. (Además, desde el punto de vista inglés, "equals" es diferente de "is".)
La lógica no es defectuosa. La declaración
si x es y entonces x==y también es verdadero
nunca debe leerse en el sentido de
si x==y entonces x es y
Es un error lógico por parte del lector suponer que lo contrario de un enunciado lógico es cierto. Ver http://en.wikipedia.org/wiki/Converse_(logic)