Python vs superficial profunda Copia : Aquí, vamos a conocer cuáles son los copia superficial y copia profunda en el lenguaje de programación Python?
En Python, el operador de asignación no copia los objetos, en cambio, crean enlaces entre un objeto y el objetivo. El objeto, si una colección que es mutable o consiste en elementos mutables utiliza la copia de modo que uno puede cambiar una copia sin cambiar la otra.
La copia módulo proporciona genérico poco profundas y las operaciones de copia profundas ,
Shallow Copia
A copia superficial construye un nuevo objeto compuesto y luego inserta referencias en él para los objetos encontrados en el original. Este proceso no es recursivo y por lo tanto no crea copias del objeto secundario. En copia superficial, una referencia de objeto se copia a otro objeto, es decir, los cambios realizados en la copia del objeto reflejará en el objeto original también.
copy.copy(x) # returns shallow copy
Ejemplo:
-bash-4.2$ python3
Python 3.6.8 (default, Apr 25 2019, 21:02:35)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import copy
>>> xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> ys = copy.copy(xs)
>>> print(xs)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> print(ys)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> xs.append(['new sublist']) # Modifying the copied list at a "superficial" level was no problem at all.
>>> print(xs)
[[1, 2, 3], [4, 5, 6], [7, 8, 9], ['test']]
>>> print(ys)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> xs[1][0] = 'X1' // changes both 'xs' and 'ys'
>>> print(xs)
[[1, 2, 3], ['X1', 5, 6], [7, 8, 9], ['test']]
>>> print(ys)
[[1, 2, 3], ['X1', 5, 6], [7, 8, 9]]
profundo Copia
A copia profunda construye un nuevo objeto compuesto y luego inserta de forma recursiva las copias en ella los objetos encontrados en el original.
copy.deepcopy(x) # returns a deep copy
Ejemplo:
-bash-4.2$ python3
Python 3.6.8 (default, Apr 25 2019, 21:02:35)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import copy
>>> ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> zs = copy.deepcopy(ys)
>>> ys[1][1] = 'X'
>>> print(ys)
[[1, 2, 3], [4, 'X', 6], [7, 8, 9]]
>>> print(zs)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>
recordatorios importantes
- copia Shallow de un objeto no clon los objetos secundarios. Por lo tanto, la copia niño no es totalmente independiente de la matriz.
- Un copia profunda de un objeto de forma recursiva clon del objeto secundario y por lo tanto el objeto secundario es totalmente independiente de la matriz. Creación de una copia profunda es más lento.
- un objeto arbitrario, incluyendo clases personalizadas, se pueden copiar mediante el módulo de copia.