2010-11-11 12 views
5

¿Alguien me puede explicar esto?tuple vs list objects en python

>>> [] is [] 
False 
>>>() is() 
True 
>>> (1,) is (1,) 
False 

entiendo que debo utilizar "==" en lugar de "es" para comparar los valores, sólo me pregunto por qué es así?

Respuesta

10

is se basa en la identidad del objeto. I.E., ¿la izquierda y la derecha son el mismo objeto?

En todos estos casos, los objetos serían ordinariamente diferentes (ya que tiene seis literales separados). Sin embargo, las tuplas vacías son el mismo objeto debido al internamiento dependiente de la implementación. Como ha notado, nunca debe confiar en este comportamiento.

Tenga en cuenta que los objetos mutables no pueden ser internados, lo que significa que el primero debe ser falso.

+2

Nota: "internar" puede (no suele) se aplican a las cadenas, así como cualquier otra literal/valor inmutable. Debido a que son inmutables, cualquier implementación de Python tiene la opción de hacer que diferentes referencias converjan (señalen) cualquier instancia única del objeto. Eso es lo que significa internar en este contexto. Interning es un detalle de implementación que optimiza para casos de uso común. Las listas de Python, por cierto, son mutables y, por lo tanto, no pueden estar sujetas a internamiento. –

+1

El primero no es una comparación entre una lista y una tupla, sino entre dos listas. Es falso porque son objetos diferentes (es decir, ID diferentes) que solo tienen el mismo valor (es decir, ambos son listas vacías). – rbp

+0

@rbp, gracias, leí mal la pregunta antes. –

2

creo que de esta manera: En el primer caso, para los objetos inmutables como tuplas, es seguro para la ejecución de pitón para compartir si están idénticos:

>>> a =() 
>>> b =() 
>>> a is b 
True 

Consideremos ahora:

>>> a = [] 
>>> b = [] 
>>> a.append("foo") 
>>> print a,b 
['foo'] [] 

No es posible que ayb sean el mismo objeto, porque la modificación a no debería modificar b.

En su último ejemplo, ha vuelto a las tuplas inmutables. La implementación de Python es permitida para hacer que sean el mismo objeto, pero no es obligatorio, y en este caso no (es básicamente una compensación de espacio/tiempo - si usó mucho (1) en su programa podría guardar memoria si fueron internados, pero costaría tiempo de ejecución determinar si una tupla dada era un (1,) que podría compartir el objeto.

3

Tenga cuidado al comparar por id. Si un objeto es GC'd ¡la identificación puede ser reutilizada!

>>> id([])==id([]) 
True 

o incluso

>>> id([1,2,3])==id(["A","B","C"]) 
True 
+0

¡Excelente punto! – rbp