Como copiar uma lista em Python (cópia superficial vs. cópia profunda)

Aprenda como copiar uma lista em Python. Explore o fatiamento de lista, o método copy(), os construtores de lista e domine a diferença entre cópias superficiais e profundas.

Experimente esta solução no Editor

Visão geral

Em Python, as listas são objetos mutáveis e as variáveis contêm referências a esses objetos na memória, em vez dos valores reais. Isso significa que se você atribuir uma lista a uma nova variável (por exemplo, `list_b = list_a`), ambas as variáveis ​​referenciarão exatamente a mesma lista. Qualquer modificação feita através de `list_b` afetará imediatamente `list_a`. Para evitar esse efeito colateral, você deve criar uma cópia explícita da lista.

Python oferece várias maneiras de criar uma cópia superficial de uma lista. Uma cópia superficial constrói uma nova lista contendo referências aos elementos encontrados na lista original. Métodos comuns incluem usar o método de lista integrado `.copy()`, usar o fatiamento de lista `list_a[:]` ou passar a lista para o construtor `list()`. Tudo isso cria um novo contêiner de lista, permitindo anexar ou remover elementos de forma independente.

No entanto, se uma lista contiver objetos mutáveis aninhados (como listas ou dicionários), uma cópia superficial apenas duplicará o contêiner externo; os objetos aninhados permanecem compartilhados. Modificar uma lista aninhada na cópia alterará a lista original. Para evitar isso, você deve realizar uma cópia profunda usando a função `deepcopy()` do módulo `copy`, que clona recursivamente todos os objetos dentro da hierarquia.

Saída de código e execução

Este código demonstra a armadilha de atribuição de referência, cópia superficial usando list.copy() e cópia profunda de listas aninhadas usando o módulo copy.

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)
Saída 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]]

Implementação passo a passo

  • Use my_list.copy() ou my_list[:] para criar uma cópia superficial de estruturas de lista simples.
  • Evite atribuições de referência como copy_list = my_list quando precisar de coleções independentes.
  • Importe o módulo copy e use copy.deepcopy(my_list) para listas contendo estruturas mutáveis aninhadas.
  • Certifique-se de compreender suas estruturas de dados para otimizar o desempenho e o consumo de memória.

Perguntas frequentes

Qual é a diferença entre uma cópia superficial e uma cópia profunda?

Uma cópia superficial copia o contêiner mais externo, mas faz referência a objetos mutáveis aninhados. Uma cópia profunda duplica recursivamente todos os contêineres e objetos aninhados, resultando em estruturas de dados completamente isoladas.

O fatiamento de lista (list[:]) é mais rápido que list.copy()?

Eles são virtualmente idênticos em desempenho, pois ambos executam operações C otimizadas nos bastidores. Usar list.copy() geralmente é preferido para facilitar a leitura.

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.