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.
519
3
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
Se utiliza
==
cuando se comparan valores yis
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:
escribir:
Para comparar contra
None
, se prefiereis None
a== None
.Siempre me ha gustado usar "is" porque
Sí, eso es exactamente lo que it's para.
Me gustaría mostrar un pequeño ejemplo sobre cómo
es
y==
están involucrados en los tipos inmutables. Inténtalo:is
compara dos objetos en memoria,==
compara sus valores. Por ejemplo, puedes ver que los enteros pequeños son almacenados en caché por Python:Deberías usar
==
cuando comparas valores yis
cuando comparas identidades. (Además, desde el punto de vista del inglés, "equals" es diferente de "is").Ver Esta pregunta
Su lógica en la lectura
es ligeramente defectuoso.
Si
es
se aplica entonces==
será Verdadero, pero NO se aplica a la inversa.==
puede dar True mientras queis
da False.