Comparación de cadenas en Python: es vs == [duplicate]


Esta pregunta ya tiene una respuesta aquí:

Me di cuenta de que un script de Python que estaba escribiendo estaba actuando arduamente, y lo rastreé hasta un bucle infinito, donde la condición del bucle era while line is not ''. Corriendo a través de él en el depurador, se volvió fuera de esa línea era de hecho ''. Cuando lo cambié a !='' en lugar de is not '', funcionó bien.

Además, ¿se considera generalmente mejor usar '==' por defecto, incluso cuando se comparan valores int o booleanos? Siempre me ha gustado usar ' is ' porque lo encuentro más estético y pitónico (que es cómo caí en esta trampa...), pero me pregunto si está destinado a ser reservado para cuando te importa encontrar dos objetos con el mismo id.

Author: Coquelicot, 2010-06-07

4 answers

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

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

También, se considera generalmente mejor usar '= = ' por defecto, incluso al comparar valores int o booleanos?

Usted use == cuando compare valores y is cuando compare identidades.

Al comparar ints (o tipos inmutables en general), casi siempre desea el primero. Hay una optimización que permite comparar enteros pequeños con is, pero no confíe en ella.

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

if x == True:
    # do something

Escribe:

if x:
    # do something

Para comparar contra None, is None se prefiere a == None.

Siempre me ha gustado usar ' is ' porque Me parece más estéticamente agradable y pitónico (que es cómo caí en esta trampa...), pero me pregunto si es destinado a ser reservado para cuando te importa encontrar dos objetos con la misma identificación.

Sí, para eso es exactamente.

 545
Author: dan04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 11:53:00

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

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

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

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

Debe usar == al comparar valores y is al comparar identidades. (También, desde un punto de vista inglés, "equals" es diferente de"is".)

 233
Author: pygabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-07 10:14:49

La lógica no es defectuosa. La declaración

Si x es y entonces x = = y también es Verdadero

Debe nunca entenderse como

Si x = = y entonces x es y

Es un error lógico por parte del lector asumir que lo contrario de una declaración lógica es verdadero. Véase http://en.wikipedia.org/wiki/Converse_ (lógica)

 62
Author: xubio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 05:46:26

Ver Esta pregunta

Su lógica en la lectura

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

Es ligeramente defectuoso.

Si is se aplica entonces == será Verdadero, pero NO se aplica al revés. == puede producir True mientras que is produce False.

 25
Author: pycruft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:37