Comparación de cadenas en Python: es vs == [duplicate]
Esta pregunta ya tiene una respuesta aquí:
- ¿Por qué comparar cadenas en Python usando '==' o 'is' a veces produce un resultado diferente? 14 respuestas
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.
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.
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".)
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)
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.
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