Volver a la lista

Propagación de referencias en objetos mutables: la trampa de la copia.

Aprende por qué al copiar una lista en Python el original se modifica, la diferencia entre copia superficial (shallow copy) y copia profunda (deep copy), y cómo usar el módulo `copy`.

Intermedio
|
10min
|
Verificado (2026-07)
objetos mutablespropagación de referenciasshallow copydeep copymutablecopia de listas
Progreso0/18 (0%)

Propagación de referencias en objetos mutables: la trampa de la copia

Al finalizar este tema

Comprenderá por qué al copiar una lista en Python mediante = el original se modifica, y podrá distinguir entre copia superficial y copia profunda para utilizarlas correctamente.


Copié, pero el original cambió

python
original = [1, 2, 3]
copy = original
copy.append(4)
print(original) # [1, 2, 3, 4] — ¡El original también cambia!

copy = original no es una copia. Es simplemente añadir otra etiqueta a la misma lista. original y copy son dos nombres que apuntan a la misma lista.

En el tema anterior (Variables y memoria), aprendimos que una variable no es una "caja que contiene valores", sino una "flecha que apunta a un objeto". Este es precisamente el momento en el que esto puede causar problemas en la práctica.

python
print(id(original)) # 4392957504
print(id(copy)) # 4392957504 — ¡La misma dirección!

Copia real — Slicing

python
original = [1, 2, 3]
copy = original[:] # Rebanado completo = nueva lista
copy.append(4)
print(original) # [1, 2, 3] — El original no cambia
print(copy) # [1, 2, 3, 4]

[:] corta la lista desde el principio hasta el final para crear una nueva lista. list(original) y original.copy() tienen el mismo efecto.


Limitaciones de la copia superficial

python
matrix = [[1, 2], [3, 4]]
shallow = matrix[:]
shallow[0][0] = 99
print(matrix) # [[99, 2], [3, 4]] — ¡El original también cambia!

El slicing copia solo el primer nivel. matrix[:] crea una nueva lista externa, pero los elementos internos [1, 2] y [3, 4] comparten el mismo objeto. Si se modifica el interior, los cambios también se reflejarán en el original.

Esto es una copia superficial (shallow copy).


Copia profunda — copy.deepcopy

python
import copy
matrix = [[1, 2], [3, 4]]
deep = copy.deepcopy(matrix)
deep[0][0] = 99
print(matrix) # [[1, 2], [3, 4]] — El original no cambia

deepcopy realiza una copia recursiva de todos los objetos internos. Es un nuevo objeto completamente independiente.


Cuándo usar cada uno

SituaciónMétodoRazón
Listas unidimensionaleslst[:] o lst.copy()Rápido y sencillo
Listas anidadas (2D o más)copy.deepcopy(lst)Requiere independencia de las listas internas
Diccionariosdict.copy() o {**d}Copia superficial de un solo nivel
Diccionarios anidadoscopy.deepcopy(d)Independencia de dicts/list internos
Cuando no es necesario copiar= tal cualPara compartir intencionalmente el mismo objeto

Lo mismo se aplica a los argumentos de función

python
def add_item(lst, item):
lst.append(item)
return lst
my_list = [1, 2, 3]
result = add_item(my_list, 4)
print(my_list) # [1, 2, 3, 4] — El original cambia

Al pasar una lista a una función, se pasa por referencia. Si se .append() dentro de la función, el original también cambiará. Para preservar el original, realice primero una copia dentro de la función:

python
def add_item_safe(lst, item):
new_lst = lst[:]
new_lst.append(item)
return new_lst

Resumen de mutabilidad vs. inmutabilidad

TipoMutable/InmutableEfecto en el original al modificar la copia =
int, float, str, tupleInmutableSin efecto (se crea un nuevo objeto de todos modos)
list, dict, setMutableEl original también cambia

Los objetos inmutables no presentan este problema, ya que al "modificar" una cadena, siempre se crea una nueva. Solo es necesario tener precaución con los objetos mutables.


Puntos clave

= no es una copia, sino asignar un nuevo nombre al mismo objeto. Para estructuras unidimensionales, use [:] o .copy(); para estructuras anidadas, use copy.deepcopy(). Si pasa un objeto mutable a una función, el original puede cambiar; si no es su intención, realice una copia primero.

💬 Preguntas y comentarios

0 comentarios

Puedes publicar sin iniciar sesión. Los comentarios de invitados no pueden editarse ni eliminarse después.

0/2000

Cargando...