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.
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)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
Aprenda como dividir listas em Python usando a poderosa sintaxe de colchetes. Argumentos mestres de início, parada e etapa, indexação negativa e listas reversas.
Como remover duplicatas de uma lista em PythonAprenda como remover duplicatas de uma lista em Python enquanto mantém ou ignora a ordem. Compare conversões de conjunto, chaves de ditado e métodos de loop.
Recursos Python recomendados
Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.
Variáveis e tipos de dados Python explicados
Entenda as variáveis do Python e os principais tipos de dados (strings, inteiros, flutuantes, booleanos). Um guia completo para iniciantes sobre atribuição de memória em Python.
Folha de referências de métodos de lista Python
Guia de referência rápida para operações de lista Python. Domine a adição, inserção, remoção, classificação e fatiamento de elementos.
Python vs JavaScript: qual linguagem de programação é a melhor?
Uma comparação abrangente entre Python e JavaScript. Explore diferenças de sintaxe, desempenho, casos de uso (backend versus frontend) e exemplos de codificação.