134 lines
2.6 KiB
Python
134 lines
2.6 KiB
Python
|
#!/usr/bin/env python
|
||
|
"""
|
||
|
# Copia de elementos
|
||
|
|
||
|
- Copia de elementos mutables con el modulo 'copy'
|
||
|
- Diferencias entre copia superficial y copia profunda (shallow & deep copying)
|
||
|
- Copia exacta de objetos personalizados (custom objects).
|
||
|
|
||
|
"""
|
||
|
|
||
|
# import copy
|
||
|
|
||
|
orig = 5
|
||
|
|
||
|
# Nueva variable con la misma referencia
|
||
|
copia = orig
|
||
|
|
||
|
# Nueva variable con otra referencia
|
||
|
copia = 6
|
||
|
|
||
|
print(orig,copia)
|
||
|
# 5 6
|
||
|
|
||
|
# Lista, la copia 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]
|
||
|
|
||
|
|
||
|
# copia nueva variable, nueva referencia
|
||
|
copia2 = orig.copy()
|
||
|
|
||
|
orig[0] = 9
|
||
|
|
||
|
print(orig, copia2) # [9, 1, 2, 3] [-10, 1, 2, 3]
|
||
|
|
||
|
|
||
|
|
||
|
import copy
|
||
|
|
||
|
# shallow copy: Un nivel de profundidad, solo referencias de
|
||
|
# objetos hijos anidados.
|
||
|
# make a shallow copy of y
|
||
|
# x = copy.copy(orig)
|
||
|
|
||
|
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[:]
|
||
|
|
||
|
# 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]]
|
||
|
|
||
|
# deep copy: Copia completamente independiente
|
||
|
# make a deep copy of y
|
||
|
# x = copy.deepcopy(orig)
|
||
|
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
|
||
|
|
||
|
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
|
||
|
|
||
|
|
||
|
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
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|