Come copiare una lista in Python (copia superficiale o copia profonda)

Scopri come copiare una lista in Python. Esplora l'affettamento delle liste, il metodo copy(), i costruttori delle liste e padroneggia la differenza tra copie superficiali e profonde.

Prova questa soluzione nell'editor

Panoramica

In Python, le liste sono oggetti mutabili e le variabili contengono in memoria riferimenti a questi oggetti anziché i valori effettivi. Ciò significa che se assegni una lista a una nuova variabile (ad esempio, `list_b = list_a`), entrambe le variabili fanno riferimento esattamente alla stessa lista. Qualsiasi modifica apportata tramite "list_b" avrà effetto immediato su "list_a". Per evitare questo effetto collaterale, è necessario creare una copia esplicita dell'elenco.

Python offre diversi modi per creare una copia superficiale di un elenco. Una copia superficiale costruisce un nuovo elenco contenente riferimenti agli elementi trovati nell'elenco originale. I metodi comuni includono l'uso del metodo built-in list `.copy()`, l'uso dello slicing di liste `list_a[:]`, o il passaggio della lista al costruttore `list()`. Tutti questi creano un nuovo contenitore di elenchi, consentendoti di aggiungere o rimuovere elementi in modo indipendente.

Tuttavia, se un elenco contiene oggetti mutabili nidificati (come elenchi o dizionari), una copia superficiale duplicherà solo il contenitore esterno; gli oggetti nidificati rimangono condivisi. La modifica di un elenco nidificato nella copia modificherà l'elenco originale. Per evitare ciò, è necessario eseguire una copia profonda utilizzando la funzione "deepcopy()" del modulo `copy`, che clona ricorsivamente ogni oggetto all'interno della gerarchia.

Codice e output di esecuzione

Questo codice dimostra la trappola dell'assegnazione dei riferimenti, la copia superficiale utilizzando list.copy() e la copia approfondita di elenchi nidificati utilizzando il modulo copy.

copy_lists.py
Prova nell'editor
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)
Uscita terminale
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]]

Implementazione passo dopo passo

  • Utilizza my_list.copy() o my_list[:] per creare una copia superficiale delle strutture di elenchi semplici.
  • Evita assegnazioni di riferimento come copy_list = my_list quando hai bisogno di raccolte indipendenti.
  • Importa il modulo copy e usa copy.deepcopy(my_list) per elenchi contenenti strutture mutabili nidificate.
  • Assicurati di comprendere le strutture dei dati per ottimizzare le prestazioni e l'ingombro della memoria.

Domande frequenti

Qual è la differenza tra una copia superficiale e una copia profonda?

Una copia superficiale copia il contenitore più esterno, ma fa riferimento a oggetti mutabili nidificati. Una copia approfondita duplica ricorsivamente tutti i contenitori e gli oggetti nidificati, risultando in strutture dati completamente isolate.

L'affettatura delle liste (list[:]) è più veloce di list.copy()?

Sono praticamente identici in termini di prestazioni poiché entrambi eseguono operazioni C ottimizzate sotto il cofano. L'uso di list.copy() è generalmente preferito per la leggibilità.

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.