Introducción a la copia de listas y diccionarios en Python
Cuando trabajamos con listas y diccionarios en Python, a menudo necesitamos copiar estos objetos para evitar modificar los originales. Sin embargo, copiar colecciones en Python no siempre es tan sencillo como parece. Existen dos tipos principales de copia: copia superficial (shallow copy) y copia profunda (deep copy). En este artículo te explicaremos cómo copiar correctamente listas y diccionarios en Python, y cuándo usar cada método.
¿Por qué no basta con el operador «=»?
Al usar el operador = para asignar una lista o diccionario a una nueva variable, no se crea una copia independiente, sino que ambas variables apuntan al mismo objeto en memoria.
lista1 = [1, 2, 3] lista2 = lista1 lista2.append(4) print(lista1) # Resultado: [1, 2, 3, 4]
Como puedes ver, modificar lista2 también afecta a lista1. Por eso, es necesario conocer los métodos de copia adecuados.
¿Cómo copiar correctamente listas y diccionarios en Python?
Copia superficial (Shallow Copy)
Una copia superficial crea un nuevo objeto, pero los elementos internos siguen siendo referencias a los objetos originales. Es adecuada para listas y diccionarios cuyos elementos son inmutables o cuando no necesitas copiar estructuras anidadas.
Copiando listas (shallow copy)
lista1 = [1, 2, 3] lista2 = lista1.copy() # O también: lista2 = list(lista1) lista2.append(4) print(lista1) # Resultado: [1, 2, 3] print(lista2) # Resultado: [1, 2, 3, 4]
Copiando diccionarios (shallow copy)
dicc1 = {a: 1, b: 2} dicc2 = dicc1.copy() # O también: dicc2 = dict(dicc1) dicc2[c] = 3 print(dicc1) # Resultado: {a: 1, b: 2} print(dicc2) # Resultado: {a: 1, b: 2, c: 3}
Limitaciones de la copia superficial
Si tu lista o diccionario contiene objetos mutables anidados (por ejemplo, listas dentro de listas), la copia superficial solo copia las referencias. Veamos un ejemplo:
lista1 = [[1, 2], [3, 4]] lista2 = lista1.copy() lista2[0].append(99) print(lista1) # Resultado: [[1, 2, 99], [3, 4]]
Como puedes ver, modificar un elemento anidado en la copia también afecta al original.
¿Qué es una copia profunda (Deep Copy) y cuándo usarla?
Una copia profunda crea un nuevo objeto y también copia recursivamente todos los objetos internos, logrando una independencia total entre la copia y el original. Es imprescindible cuando trabajas con estructuras anidadas.
¿Cómo hacer una deep copy en Python?
Para realizar una copia profunda, utiliza el módulo copy y su función deepcopy():
import copy lista1 = [[1, 2], [3, 4]] lista2 = copy.deepcopy(lista1) lista2[0].append(99) print(lista1) # Resultado: [[1, 2], [3, 4]] print(lista2) # Resultado: [[1, 2, 99], [3, 4]]
Ahora, modificar la copia profunda no afecta al original.
Deep copy con diccionarios anidados
import copy dicc1 = {a: {x: 1}, b: 2} dicc2 = copy.deepcopy(dicc1) dicc2[a][x] = 99 print(dicc1) # Resultado: {a: {x: 1}, b: 2} print(dicc2) # Resultado: {a: {x: 99}, b: 2}
Resumen: ¿Cuándo usar shallow copy y cuándo deep copy?
- Usa copia superficial (
copy()
) cuando tu lista o diccionario no contiene objetos mutables anidados o no necesitas modificar esos objetos internos. - Usa copia profunda (
copy.deepcopy()
) cuando hay estructuras anidadas y necesitas que la copia sea totalmente independiente del original.
Errores comunes al copiar listas y diccionarios en Python
- Usar = pensando que se crea una copia independiente.
- Olvidar que copy() solo hace una copia superficial.
- No usar deepcopy() en estructuras anidadas, lo que puede provocar errores difíciles de detectar.
Conclusión
Copiar listas y diccionarios en Python correctamente es fundamental para evitar errores inesperados en tus programas. Ahora que conoces las diferencias entre copia superficial (shallow copy) y copia profunda (deep copy), puedes elegir la técnica adecuada para cada situación. Recuerda: si trabajas con estructuras anidadas y necesitas independencia total, usa siempre deepcopy().