3.7 KiB
Copia de elementos
- Copia de elementos mutables con el modulo 'copy'
- Diferencias entre copia superficial y copia profunda (shallow & deep copying)
- Copia de Clases y Objetos
Copia
Nueva variable, con la misma referencia
orig = 5
copia = orig
Copia
Nueva variable con otra referencia
copia = 6
print(orig,copia)
# 5 6
Copia lista
Asigna la misma referencia a nueva variable
orig = [0, 1, 2, 3]
copia = orig
copia[0] = -10
print(orig, copia)
# [-10, 1, 2, 3] [-10, 1, 2, 3]
lista.copy()
nueva variable, nueva referencia
copia2 = orig.copy()
orig[0] = 9
print(orig, copia2)
# [9, 1, 2, 3] [-10, 1, 2, 3]
Modulo copy
La diferencia entre copia superficial y profunda, es solo relevante para objetos
compuestos (objetos que contienen otros objetos), como listas, clases o instancias
-
copia superficial: construye un nuevo objeto compuesto, y luego (a medida de lo posible), inserta
referencias en los objetos encontrados en el original. -
copia profunda construye un nuevo un nuevo objeto, y luego, recursivamente, inserta copias de
los objetos que se encuentran en el original.
Copia superficial (shallow) y profunda (deep)
import copy
Shallow copy:
- Un nivel de profundidad, solo referencias de
objetos hijos anidados.x = copy.copy(y)
Deep copy:
- Copia completamente independiente
x = copy.deepcopy(y)
Superficial
import copy
orig = [0, 1, 2, 3, 4]
copia = orig
copia = copy.copy(orig)
copia[0] = -10
print(copia)
# [-10, 1, 2, 3, 4]
print(orig)
# [0, 1, 2, 3, 4]
Otras formas de copiar listas superficialmente
copia = orig.copy()
copia = list(orig)
copia = orig[:]
Solo un solo nivel de profundidad
orig = [[0,1,2,3],[4,5,6,7]]
copia = orig.copy()
copia[0][1] = -10
print(copia)
# [[0, -10, 2, 3], [4, 5, 6, 7]]
print(orig)
# [[0, -10, 2, 3], [4, 5, 6, 7]]
Copia Profunda
import copy
orig = [[0,1,2,3],[4,5,6,7]]
copia = copy.deepcopy(orig)
copia[0][1] = -10
print(copia)
# [[0, -10, 2, 3], [4, 5, 6, 7]]
print(orig)
# [[0, 1, 2, 3], [4, 5, 6, 7]]
Copiando clases
Copia superficial
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
p1 = Persona('Zafiro', 82)
p2 = p1
p2.edad = 28
print(p2.edad) # 28
print(p1.edad) # 28
Copia superficial, solo un vivel de profundidad
import copy
p2 = copy.copy(p1)
p2.edad = 46
print(p2.edad) # 46
print(p1.edad) # 28
class Compania:
def __init__(self, jefe, empleado):
self.jefe = jefe
self.empleado = empleado
p1 = Persona('Norberto', 61)
p2 = Persona('Zerafin', 16)
compania = Compania(p1, p2)
compania_copia = copy.copy(compania)
compania_copia.jefe.edad = 36
# copia superficial, solo un nivel mas de profundidad
# apunta a la misma referencia en este nivel.
print(compania_copia.jefe.edad)
# 36
print(compania.jefe.edad)
# 36
Copia profunda, independiente
compania = Compania(p1, p2)
compania_copia = copy.deepcopy(compania)
compania_copia.jefe.edad = 64
print(compania_copia.jefe.edad)
# 64
print(compania.jefe.edad)
# 36