2010-09-15 13 views

Respuesta

51

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).

+8

* si a y b son el mismo objeto * - Me gustaría que * estén vinculados al mismo objeto * incluso mejor. –

+0

@ Space_C0wb0y: Solucionado. –

8

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.

28

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.

3

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.

+0

'a = b'. Creo que ahora tenemos garantizado que 'a es b'. – recursive

+0

@recursive that is true :) – Jiaaro

+0

@recursive, ¿sabes si ese es el caso de las cadenas/números? –

20

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 
+0

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

+0

"..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

+3

@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

2

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 
0

@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.

Cuestiones relacionadas