capítulo anterior: Sets and Frozen Sets
capítulo siguiente: Functions

shallow and Deep Copy

Introducción


Como hemos visto en el capítulo «tipos de datos y Variables», Python tiene un comportamiento extraño, en comparación con otros lenguajes de Programación, Al asignar y copiar tipos de datos simples como enteros y cadenas. La diferencia entre la copia superficial y profunda solo es relevante para objetos compuestos, que son objetos que contienen otros objetos, como listas o instancias de clases.,
en el siguiente fragmento de código y apunta a la misma ubicación de memoria que X. Esto cambia, cuando asignamos un valor diferente a y. en este caso y recibirá una ubicación de memoria separada, como hemos visto en el capítulo «tipos de datos y Variables».

>>> x = 3>>> y = x

pero incluso si este comportamiento interno parece extraño en comparación con lenguajes de programación como C, C++ y Perl, sin embargo, los resultados observables de las asignaciones responden a nuestras expectativas. Pero puede ser problemático, si copiamos objetos mutables como listas y diccionarios.
Python crea copias reales solo si tiene que hacerlo, i. e., si el usuario, el programador, lo exige explícitamente.
le presentaremos los problemas más cruciales, que pueden ocurrir al copiar objetos mutables, es decir, al copiar listas y diccionarios.

copiando una lista

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

en el ejemplo anterior se asigna una lista simple a colours1. En el siguiente paso asignamos colour1 a colours2. Después de esto, se asigna una nueva lista a colours2.como esperábamos, los valores de los colores1 se mantuvieron sin cambios., Al igual que en nuestro ejemplo en el capítulo «tipos de datos y variables», se había asignado una nueva ubicación de memoria para colours2, porque hemos asignado una nueva lista completa a esta variable.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

pero la pregunta es, ¿qué pasará si cambiamos un elemento de la lista de colours2 o colours1?
en el ejemplo anterior, asignamos un nuevo valor al segundo elemento de colours2. Muchos principiantes se sorprenderán de que la lista de colores1 también se haya cambiado «automáticamente»., la explicación es que no ha habido ninguna nueva asignación a colours2, solo a uno de sus elementos.

copiar con el operador Slice

es posible copiar completamente estructuras de listas poco profundas con el operador slice sin tener ninguno de los efectos secundarios, que hemos descrito anteriormente:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

pero tan pronto como una lista contiene sublistas, tenemos la misma dificultad, es decir, solo punteros a las publicaciones.,

>>> lst1 = ]>>> lst2 = lst1

Este comportamiento se muestra en el siguiente diagrama:

Si asigna un nuevo valor al elemento 0 de una de las dos listas, no habrá ningún efecto secundario. Los problemas surgen, si se cambia uno de los elementos de la sublista.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

El siguiente diagrama muestra lo que sucede si se cambia uno de los elementos de una sublista: se cambian tanto el contenido de lst1 como el de lst2.,

Usando el método deepcopy desde el módulo copy

una solución a los problemas descritos es usar el módulo «copy». Este módulo proporciona el método «Copiar», que permite una copia completa de una lista arbitraria, es decir, listas superficiales y otras.
el siguiente script utiliza nuestro ejemplo anterior y este método:

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

si guardamos este script bajo el nombre de deep_copy.py y si llamamos al script con » python deep_copy.,py», obtendremos la siguiente salida:

$ python deep_copy.py ]]

Capítulo Anterior: Conjuntos y Congelados Conjuntos
Capítulo Siguiente: Funciones

Deja una respuesta

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