Saltar al contenido

¿Cómo copiar correctamente listas y diccionarios en Python? Shallow vs Deep Copy explicado

27/04/2025
¿Cómo copiar correctamente listas y diccionarios (shallow vs deep copy)?
Compartir:
Índice de Contenido

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

Quizás también te interese:  ¿Cuál es la diferencia entre == e is en Python? Explicación fácil con ejemplos

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().

Compartir: