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

Resuelto Coquelicot asked hace 14 años • 4 respuestas

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.

Coquelicot avatar Jun 07 '10 15:06 Coquelicot
Aceptado

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 isal 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 Nonese 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.

dan04 avatar Jun 07 '2010 08:06 dan04

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

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

iscompara 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 isal comparar identidades. (Además, desde el punto de vista inglés, "equals" es diferente de "is".)

pygabriel avatar Jun 07 '2010 09:06 pygabriel

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)

xubio avatar May 10 '2013 05:05 xubio