El GIST a tomar es el siguiente: tratar con listas poco profundas (sin sublistas, solo elementos individuales) usando "asignación normal" aumenta un "efecto secundario" cuando crea una lista superficial y luego crea una copia de esta lista usando "asignación normal" . Este "efecto secundario" se produce cuando cambia cualquier elemento de la lista de copias creado, porque cambiará automáticamente los mismos elementos de la lista original. Eso es copy
útil, ya que no cambiará los elementos de la lista original al cambiar los elementos de copia.
Por otro lado, también copy
tiene un "efecto secundario", cuando tiene una lista que contiene listas (sub_lists) y la deepcopy
resuelve. Por ejemplo, si crea una lista grande que tiene listas anidadas (sub_lists) y crea una copia de esta lista grande (la lista original). El "efecto secundario" surgiría cuando modifique las sub_listas de la lista de copias, lo que modificaría automáticamente las sub_listas de la lista grande. A veces (en algunos proyectos) desea mantener la lista grande (su lista original) tal como está sin modificaciones, y todo lo que desea es hacer una copia de sus elementos (sub_lists). Para eso, su solución es usar el deepcopy
que se encargará de este "efecto secundario" y hará una copia sin modificar el contenido original.
Los diferentes comportamientos copy
y deep copy
operaciones se refieren solo a objetos compuestos (es decir, objetos que contienen otros objetos como listas).
Estas son las diferencias ilustradas en este ejemplo de código simple:
primero
Vamos a ver cómo se copy
comporta (superficial), creando una lista original y una copia de esta lista:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Ahora, ejecutemos algunas print
pruebas y veamos cómo se comporta la lista original en comparación con su lista de copias:
original_list y copy_list tienen diferentes direcciones
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
Los elementos de original_list y copy_list tienen las mismas direcciones
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
Los subelementos de original_list y copy_list tienen las mismas direcciones
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
la modificación de elementos original_list NO modifica elementos copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
modificar elementos copy_list NO modifica elementos original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
modificar sub_elementos original_list modificar automáticamente sub_elementos copy_list
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
modificando copy_list sub_elements modifica automáticamente original_list sub_elements
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
Segundo
Vamos a ver cómo se deepcopy
comporta, haciendo lo mismo que hicimos con nosotros copy
(creando una lista original y una copia de esta lista):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Ahora, ejecutemos algunas print
pruebas y veamos cómo se comporta la lista original en comparación con su lista de copias:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list y copy_list tienen diferentes direcciones
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
Los elementos de original_list y copy_list tienen las mismas direcciones
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
Los subelementos de original_list y copy_list tienen diferentes direcciones
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
la modificación de elementos original_list NO modifica elementos copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
modificar elementos copy_list NO modifica elementos original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
modificar sub_elementos original_list NO modifica sub_elementos copy_list
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
modificando copy_list sub_elements NO modifica original_list sub_elements
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]