varios vacia una tipos sentencias misma llenar lista len for eliminar elementos crear comparar python python-3.x tuples identity python-internals

vacia - sentencias en python



Dos variables en Python tienen la misma identificación, pero no listas o tuplas. (4)

Dos variables en Python tienen la misma id :

a = 10 b = 10 a is b >>> True

Si tomo dos list :

a = [1, 2, 3] b = [1, 2, 3] a is b >>> False

de acuerdo con este enlace, Senderle respondió que las referencias de objetos inmutables tienen la misma identificación y los objetos mutables, como las listas, tienen identificadores diferentes.

Entonces, según su respuesta, las tuplas deberían tener los mismos identificadores, es decir:

a = (1, 2, 3) b = (1, 2, 3) a is b >>> False

Idealmente, como las tuplas no son mutables, debería devolver True , ¡pero devuelve False !

¿Cuál es la explicación?


Echa un vistazo a este código:

>>> a = (1, 2, 3) >>> b = (1, 2, 3) >>> c = a >>> id(a) 178153080L >>> id(b) 178098040L >>> id(c) 178153080L

Para descubrir por qué a is c se evalúa como True mientras que a is b produce False , le recomiendo que ejecute paso a paso el fragmento anterior en el Tutorial de Python en línea . La representación gráfica de los objetos en la memoria le proporcionará una visión más profunda de este problema (adjunto una captura de pantalla).


Los objetos inmutables no tienen la misma id y, de hecho, esto no es cierto para ningún tipo de objetos que defina por separado. En términos generales, cada vez que defina un objeto en Python, creará un nuevo objeto con una nueva identidad.

Sin embargo, en aras de la optimización (en su mayoría) hay algunas excepciones para los enteros pequeños (entre -5 y 256) y las cadenas pequeñas (cadenas internados, con una longitud especial (generalmente menos de 20 caracteres)) que son singletons y tienen la misma id (en realidad, un objeto con puntero múltiple). Puede verificar este hecho de la siguiente manera:

>>> 30 is 20 + 10 True >>> >>> 300 is 200 + 100 False >>> ''aa'' * 2 is ''a'' * 4 True >>> ''aa'' * 20 is ''a'' * 40 False

Y para un objeto personalizado:

>>> class A: ... pass ... >>> A() is A() # Every time you create an instance you''ll have a new instance with new identity False

También tenga en cuenta que el operador is verificará la identidad del objeto, no el valor. Si desea verificar el valor, debe usar == :

>>> 300 == 3*100 True

Y dado que no existe tal regla para las tuplas (otros tipos) si define las dos mismas tuplas en cualquier tamaño, obtendrán sus propios identificadores:

>>> a = (1,) >>> b = (1,) >>> >>> a is b False

Y tenga en cuenta que el hecho de los enteros singleton y las cadenas internas es cierto incluso cuando los define dentro de objetos mutables e inmutables:

>>> a = (100, 700, 400) >>> >>> b = (100, 700, 400) >>> >>> a[0] is b[0] True >>> a[1] is b[1] False


Verifique el código a continuación. Las tuplas ayb están reteniendo sus referencias (ID) anteriores cuando hemos asignado sus valores anteriores. (PERO, ESTE NO SERÁ EL CASO CON LAS LISTAS COMO SON MUTABLES)

Inicialmente, ayb tienen los mismos valores ((1,2)), pero tienen ID de diferencia. Después de la modificación de sus valores, cuando reasignamos el valor (1,2) a a y b , ahora hacen referencia a SUS PROPIOS ID (88264264 y 88283400 respectivamente).

>>> a = (1,2) >>> b = (1,2) >>> a , b ((1, 2), (1, 2)) >>> id(a) 88264264 >>> id(b) 88283400 >>> a = (3,4) >>> b = (3,4) >>> id(a) 88280008 >>> id(b) 88264328 >>> a = (1,2) >>> b = (1,2) >>> id(a) 88264264 >>> id(b) 88283400 >>> a , b ((1, 2), (1, 2)) >>> id(a) , id(b) (88264264, 88283400) >>>

** Verifique el enlace ¿Por qué las tuplas no obtienen la misma ID cuando se les asignan los mismos valores? También después de leer esto. Otro caso también se ha discutido aquí.


!= Inmutable != Mismo objeto. * *

Un objeto inmutable es simplemente un objeto cuyo estado no puede ser alterado; y eso es todo. Cuando se crea un nuevo objeto, se le asignará una nueva dirección . Como tal, comprobar si las direcciones son iguales con is devolverá False .

El hecho de que 1 is 1 o "a" is "a" devuelve True se debe al almacenamiento en caché de enteros y al interning cadenas realizado por Python, así que no dejes que te confunda; no está relacionado con que los objetos en cuestión sean mutables / inmutables.

* Los objetos inmutables vacíos se refieren al mismo objeto y su valor devuelve verdadero, aunque este es un caso específico de implementación especial.