Me sorprendió bastante cuandoPython "es" declaración: ¿qué está pasando?
[] is not []
evaluaron a True
.
¿Qué está pasando en este código? ¿Qué están haciendo realmente las declaraciones not
y is
?
Me sorprendió bastante cuandoPython "es" declaración: ¿qué está pasando?
[] is not []
evaluaron a True
.
¿Qué está pasando en este código? ¿Qué están haciendo realmente las declaraciones not
y is
?
a is not b
es un operador especial que es equivalente a not a is b
.
El operador a is b
devuelve True si a y b están vinculados al mismo objeto, de lo contrario es False. Cuando crea dos listas vacías, obtiene dos objetos diferentes, por lo que is
devuelve False (y, por lo tanto, is not
devuelve True).
is
significa es la misma instancia. Se evalúa como verdadero si las variables en cada lado del operador apuntan al mismo objeto y de lo contrario es falso.
Reference, cerca de la parte inferior.
is
es la comparación de identidad.
==
es la comparación de igualdad.
Su declaración está haciendo dos listas diferentes y comprobando si son la misma instancia, que no lo son. Si usa ==
, devolverá verdadero y porque ambas son listas vacías.
es la identidad. []
y []
son dos listas diferentes (pero equivalentes). Si desea verificar si ambas listas están vacías, puede usar su valor de verdad (falso para cadenas vacías, colecciones y ceros).
if not ([] and []):
print 'Spanish Inquisition'
la única vez que is
está garantizado para devolver True es para hijos únicos como Ninguno. Al igual que Highlander, solo puede haber una instancia de None en su programa: cada vez que devuelve None es exactamente la misma "cosa" que la que no se menciona si escribe print None
.
[], OTOH, no se garantiza que sea nada excepto una lista vacía y se evalúa como False en un contexto booleano.
La mejor manera de describir por qué sucede esto es la siguiente:
Aquí es su ejemplo
>>> x = []
>>> y = []
>>> print(x is y)
... False
x
y y
son en realidad dos listas diferentes, por lo que si se añade algo a x
, no lo hace aparecer en y
>>> x.append(1)
>>> print(x)
... [1]
>>> print(y)
... []
Entonces, ¿cómo hacemos (x is y
) e valorar verdad?
>>> x = []
>>> y = x
>>> print(x is y)
... True
>>> x.append(10)
>>> print(x)
... [10]
>>> print(y)
... [10]
>>> print(x is y)
... True
si quiere ver si dos listas tienen los mismos contenidos ...
>>> x = []
>>> y = []
>>> print(x == y)
... True
>>> x.append(21)
>>> print(x)
... [21]
>>> print(y)
... []
>>> print(x == y)
... False
>>> y = [21]
>>> print(x == y)
... True
Excelente respuesta, pero después de leer [esto] (http://docs.python.org/release/2.7.3/reference/expressions.html#id26) en la referencia de Python, me confundo: _Debido a automático recogida de basura, listas libres y la naturaleza dinámica de los descriptores, ** puede observar un comportamiento aparentemente inusual en ciertos usos del operador is **, como aquellos que implican comparaciones entre métodos de instancia, o constantes._ – auraham
"..so if agregas algo a x, no aparece en y "- eso me parece incorrecto. Pruebe 'a =" prueba "; b =" prueba "; a es b'. Le dará 'True' aunque cambiar uno no cambiará el otro. – Pithikos
@Pithikos que es debido a una optimización en la versión particular de python que está utilizando, no es una garantía. Además, las cadenas son inmutables por lo que no puede cambiar uno de esos valores. solo puedes asignar una nueva cadena a la misma variable. – Jiaaro
Sé que estoy publicando en una publicación antigua. sin embargo, esto podría ayudar a alguien a tropezar con esto como yo.
"es" comprueba si la dirección de memoria es igual o no, mientras que "==" comprueba si el valor es el mismo o no. Sería mucho más claro en el siguiente ejemplo
primera Hablemos de objetos inmutables, ya que es fácil de entender
# could be any immutable object
immutable_a = 10
immutable_b = 10
# prints address of a and b variable
print "address of a is %s" % id(immutable_a)
print "address of a is %s" % id(immutable_b)
# as both addresses is same, following shall be true
print immutable_a is immutable_b
# as the values are also same, following shall be true as well
print immutable_a == immutable_b
ahora vamos a hablar de los objetos mutables
# could be any mutable object
mutable_a = [10]
mutable_b = [10]
# prints address of a and b variable
print "address of mutable_a is %s" % id(mutable_a)
print "address of mutable_b is %s" % id(mutable_b)
# as addresses are not same, following shall be false
print mutable_a is mutable_b
# as the values are same, following shall be true
print mutable_a == mutable_b
@Jiaaro es correcto. Usar is
con tipos de datos inmutables es peligroso porque no es predecible debido a la optimización del intérprete de Pythons.
ver este ejemplo:
10 * "a" is 10 * "a" # True
100 * "a" is 100 * "a" # False
En la segunda línea es rápido para crear un nuevo objeto con una nueva identificación para el intérprete. Por lo tanto, use el operador is
solo con tipos mutables.
* si a y b son el mismo objeto * - Me gustaría que * estén vinculados al mismo objeto * incluso mejor. –
@ Space_C0wb0y: Solucionado. –