Cómo copiar una lista en Python (copia superficial o profunda)

Aprenda a copiar una lista en Python. Explore la división de listas, el método copy(), los constructores de listas y domine la diferencia entre copias superficiales y profundas.

Pruebe esta solución en el Editor

Descripción general

En Python, las listas son objetos mutables y las variables contienen referencias a estos objetos en la memoria en lugar de los valores reales. Esto significa que si asigna una lista a una nueva variable (por ejemplo, `list_b = list_a`), ambas variables hacen referencia exactamente a la misma lista. Cualquier modificación realizada a través de `list_b` afectará inmediatamente a `list_a`. Para evitar este efecto secundario, debe crear una copia explícita de la lista.

Python proporciona varias formas de crear una copia superficial de una lista. Una copia superficial construye una nueva lista que contiene referencias a los elementos que se encuentran en la lista original. Los métodos comunes incluyen el uso del método de lista incorporado `.copy()`, el uso de la división de listas `list_a[:]` o pasar la lista al constructor `list()`. Todos estos crean un nuevo contenedor de lista, lo que le permite agregar o eliminar elementos de forma independiente.

Sin embargo, si una lista contiene objetos mutables anidados (como listas o diccionarios), una copia superficial sólo duplicará el contenedor externo; los objetos anidados permanecen compartidos. Modificar una lista anidada en la copia alterará la lista original. Para evitar esto, debe realizar una copia profunda usando la función `deepcopy()` del módulo `copy`, que clona recursivamente cada objeto dentro de la jerarquía.

Código y salida de ejecución

Este código demuestra la trampa de asignación de referencia, la copia superficial usando list.copy() y la copia profunda de listas anidadas usando el módulo de copia.

import copy

# 1. The assignment reference trap (Not a copy!)
original = [1, 2, 3]
reference = original
reference.append(99)
print("Reference modification affects original:", original)

# Reset list
original = [1, 2, 3]

# 2. Creating a shallow copy (using list.copy())
shallow_copy = original.copy()
shallow_copy.append(100)
print("\nOriginal:", original)
print("Shallow copy:", shallow_copy)

# 3. The nested list limitation of shallow copies
nested = [[1, 2], [3, 4]]
shallow_nested = nested.copy()
shallow_nested[0].append(99) # Modifying nested list
print("\nOriginal nested:", nested)
print("Shallow nested copy:", shallow_nested)

# 4. Creating a deep copy
nested_original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_original)
deep_copy[0].append(99)
print("\nOriginal nested:", nested_original)
print("Deep copy (completely independent):", deep_copy)
Salida terminal
Reference modification affects original: [1, 2, 3, 99]

Original: [1, 2, 3]
Shallow copy: [1, 2, 3, 100]

Original nested: [[1, 2, 99], [3, 4]]
Shallow nested copy: [[1, 2, 99], [3, 4]]

Original nested: [[1, 2], [3, 4]]
Deep copy (completely independent): [[1, 2, 99], [3, 4]]

Implementación paso a paso

  • Utilice my_list.copy() o my_list[:] para crear una copia superficial de estructuras de listas planas.
  • Evite asignaciones de referencia como copy_list = my_list cuando necesite colecciones independientes.
  • Importe el módulo de copia y use copy.deepcopy(my_list) para listas que contengan estructuras mutables anidadas.
  • Asegúrese de comprender sus estructuras de datos para optimizar el rendimiento y el uso de memoria.

Preguntas frecuentes

¿Cuál es la diferencia entre una copia superficial y una copia profunda?

Una copia superficial copia el contenedor más externo, pero hace referencia a objetos mutables anidados. Una copia profunda duplica recursivamente todos los contenedores y objetos anidados, lo que da como resultado estructuras de datos completamente aisladas.

¿El corte de listas (lista[:]) es más rápido que list.copy()?

Son prácticamente idénticos en rendimiento ya que ambos ejecutan operaciones C optimizadas bajo el capó. Generalmente se prefiere usar list.copy() para mejorar la legibilidad.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.