¿asignación, copia superficial o copia profunda?

Variable Assignment

dice en la documentación de Python que «las instrucciones de asignación en Python no copian objetos, crean enlaces entre un destino y un objeto.»Eso significa que cuando creamos una variable por asignación, la nueva variable se refiere al mismo objeto que la variable original –

>>> A = , 3, ]>>> B = A>>> id(A)
3061527080>>> id(B)
3061527080

porque la nueva variable B y la variable original A comparten el mismo objeto (p.ej., la misma lista), también contienen los mismos elementos —

>>> id(A)
3061527368>>> id(B)
3061527368

Como se ilustra en la siguiente figura, A y B compartir el mismo id, es decir, se refieren al mismo objeto en memoria. Y contienen los mismos elementos.,

Copia Superficial

Cuando creamos una variable por copia superficial, la nueva variable se refiere a un nuevo objeto —

>>> A = , 3, ]>>> C = copy(A)>>> id(A)
3062428488>>> id(C)
3062428520

Aunque A y C hace referencia a dos objetos diferentes (es decir,, dos listas con direcciones de memoria diferentes), los elementos en las dos listas se refieren a los mismos objetos —

>>> id(A)
2301696>>> id(C)
2301696>>> id(A)
3062464904>>> id(C)
3062464904

la siguiente figura ilustra cómo los elementos en A se refieren a los mismos objetos que los elementos en C.,>

Deep Copy

Similar a shallow copy, cuando creamos una variable por deep copy, la nueva variable se refiere a un nuevo objeto —

>>> A = , 3, ]>>> D = deepcopy(A)>>> id(A)
3062727496>>> id(D)
3062428488

como se describe en la documentación de Python —

la diferencia entre la copia superficial y profunda solo es relevante para objetos compuestos (objetos que contienen otros objetos, como listas o instancias de clase):

– una copia superficial construye un nuevo objeto compuesto y luego (en la medida de lo posible) inserta referencias a los objetos encontrados en el original.,

– una copia profunda construye un nuevo objeto compuesto y luego, recursivamente, inserta copias en él de los objetos encontrados en el original.

tan diferente de la copia superficial, los elementos en las dos listas ahora se refieren a diferentes objetos —

>>> id(A)
2301696>>> id(D)
2301696>>> id(A)
3062464648>>> id(D)
3062466376

pero por qué A y D el mismo objeto (es decir, tener la misma dirección de memoria)? Porque ambos se refieren a enteros, que es una de las tres excepciones debido a la optimización de memoria que mencionamos al principio.,

la siguiente figura muestra A y D se refieren a dos listas diferentes en memoria, y los elementos en A se refieren a objetos diferentes que los elementos en D excepto los elementos enteros a la optimización de la memoria.

Resumen

Si hay una toma de distancia de este artículo, debe ser de la siguiente tabla., La asignación de variables no copia objetos, por lo que A y B tienen la misma dirección de memoria y contienen los mismos elementos. Copia superficial crea un nuevo objeto para C, pero los elementos C todavía se refieren a los mismos objetos como elementos A. Deep copy también crea un nuevo objeto para D, y los elementos en D se refieren a objetos diferentes a los elementos en A con tres tipos de excepciones.,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *