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.
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.
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]]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
Scopri come suddividere gli elenchi in Python utilizzando la potente sintassi delle parentesi. Argomenti principali di avvio, arresto e passaggio, indicizzazione negativa ed elenchi di inversione.
Come rimuovere i duplicati da un elenco in PythonScopri come rimuovere i duplicati da un elenco in Python mantenendo o ignorando l'ordine. Confronta conversioni di set, chiavi dict e metodi di loop.
Risorse Python consigliate
Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.
Spiegazione delle variabili Python e dei tipi di dati
Comprendere le variabili Python e i tipi di dati principali (stringhe, numeri interi, float, booleani). Una guida completa per principianti all'assegnazione della memoria in Python.
Foglio informativo sui metodi dell'elenco Python
Guida di riferimento rapido per le operazioni sugli elenchi Python. Impara ad aggiungere, inserire, rimuovere, ordinare e affettare gli elementi.
Python vs JavaScript: quale linguaggio di programmazione è il migliore?
Un confronto completo tra Python e JavaScript. Esplora le differenze di sintassi, le prestazioni, i casi d'uso (backend e frontend) ed esempi di codifica.