Internos para tuplas de python

>>> a=1 >>> b=1 >>> id(a) 140472563599848 >>> id(b) 140472563599848 >>> x=() >>> y=() >>> id(x) 4298207312 >>> id(y) 4298207312 >>> x1=(1) >>> x2=(1) >>> id(x1) 140472563599848 >>> id(x2) 140472563599848 

hasta este punto, estaba pensando que solo habrá una copia de objeto inmutable y que todas las variables compartirán (señalarán).

Pero cuando lo intenté, los pasos a continuación comprendí que estaba equivocado.

 >>> x1=(1,5) >>> y1=(1,5) >>> id(x1) 4299267248 >>> id(y1) 4299267320 

¿Alguien puede por favor explicarme los aspectos internos?

Related of "Internos para tuplas de python"

 >>> x1=(1) >>> x2=(1) 

es en realidad lo mismo que

 >>> x1=1 >>> x2=1 

En Python, los números más pequeños se almacenan internamente en caché . Así que no se crearán en la memoria varias veces. Es por eso que los id s de x1 y x2 son los mismos hasta este punto.

Una tupla de un elemento debe tener una coma al final, como esta

 >>> x1=(1,) >>> x2=(1,) 

Al hacer esto, hay dos nuevas tuplas que se construirán con un solo elemento. Aunque los elementos dentro de las tuplas son iguales, ambos son tuplas diferentes. Es por eso que ambos tienen diferentes id .

Tomemos tu último ejemplo y desmontemos el código.

 compiled_code = compile("x1 = (1, 5); y1 = (1, 5)", "string", "exec") 

Ahora,

 import dis dis.dis(compiled_code) 

produciría algo como esto

  1 0 LOAD_CONST 3 ((1, 5)) 3 STORE_NAME 0 (x1) 6 LOAD_CONST 4 ((1, 5)) 9 STORE_NAME 1 (y1) 12 LOAD_CONST 2 (None) 15 RETURN_VALUE 

Carga un valor constante, referido por el índice 3 , que es (1, 5) y luego lo almacena en x1 . De la misma manera, carga otro valor constante, en el índice 4 y lo almacena en y1 . Si miramos la lista de constantes en el objeto de código,

 print(compiled_code.co_consts) 

daré

 (1, 5, None, (1, 5), (1, 5)) 

Los elementos en las posiciones 3 y 4 son las tuplas que creamos en el código real. Entonces, Python no crea solo una instancia para cada objeto inmutable, siempre . Es un detalle de implementación del que no tenemos que preocuparnos mucho.

Nota: Si desea tener solo una instancia de un objeto inmutable, puede hacerlo manualmente de esta manera

 x1 = (1, 5) x2 = x1 

Ahora, tanto x2 como x1 referirán el mismo objeto de tupla.