Corso
Le liste in Python sono strutture dati potenti usate per memorizzare una collezione di elementi. Il metodo di copia della lista è importante quando gestisci i dati, perché ti permette di preservare la lista originale mentre esegui operazioni su quella duplicata. In questo tutorial ti spiegherò le tecniche di base e avanzate per copiare le liste con esempi pratici.
Prima di esplorare i vari esempi, ti consiglio il corso di DataCamp Introduction to Python per imparare le basi di Python, incluse le diverse strutture dati di Python. Anche la Python Cheat Sheet for Beginners sarà utile per consultare funzioni e metodi diversi.

"Python che usa una fotocopiatrice." Immagine di Dall-E.
Risposta rapida: come copiare una lista in Python
L'esempio qui sotto mostra come copiare una lista in Python usando il metodo copy(). Nota come la lista originale rimane invariata anche se vengono apportate modifiche alla lista duplicata. Il codice stamperà [1, 2, 3].
# Define the original list
original_list = [1, 2, 3]
# Create a shallow copy of the original list
copied_list = original_list.copy()
# Modify the first element of the copied list
copied_list[0] = 99
print(original_list)
[1, 2, 3]
Altre tecniche per copiare una lista in Python
Prima di vedere le diverse tecniche per copiare una lista in Python, chiediamoci perché non usiamo l'operatore di assegnazione =. Non usiamo = perché in questo modo non creeremmo davvero una copia della lista. L'operatore di assegnazione creerebbe soltanto un riferimento alla nostra lista.
Nel seguente esempio, original_list e reference_to_original_list si riferiscono alla stessa lista dopo l'assegnazione.
# Create a list called original_list
original_list = [1, 2, 3]
# Create a new reference copied_list that points to the same list as original_list
reference_to_original_list = original_list
Qui, qualsiasi modifica sulla lista duplicata influenzerà la lista originale e viceversa. Questi cambiamenti avvengono perché le due liste sono memorizzate nella stessa area di memoria. Ora vediamo i diversi modi per copiare davvero la nostra lista.
Usare il metodo copy()
Il metodo copy() è un metodo integrato usato per creare una copia superficiale della lista. Il metodo copy() è disponibile da Python 3.3 in poi. Questo metodo copia solo la struttura della lista al primo livello. La sintassi del metodo copy() è mostrata di seguito.
new_list = original_list.copy()
Nel seguente esempio, il codice stamperà [1, 2, 3, 4].
# Original list with nested structure
original_list = [1, 2, 3, 4]
# Create a shallow copy using the copy() method
shallow_copied_list = original_list.copy()
print(shallow_copied_list)
[1, 2, 3, 4]
Usare il costruttore list()
Il costruttore list() viene usato per creare una nuova lista da una lista esistente includendo tutti gli elementi della lista originale. Questa tecnica è utile quando vuoi creare un nuovo oggetto lista in cui le modifiche alla lista copiata non influenzano la lista originale. Il codice seguente stampa [1, 2, 3].
# Create a list called original_list
original_list = [1, 2, 3]
# Create a shallow copy of original_list using the list() function
copied_list = list(original_list)
# Modify the first element of copied_list
copied_list[0] = 99
print(original_list)
[1, 2, 3]
Usare lo slicing della lista con [:]
Lo slicing della lista [:] fornisce un metodo conciso per creare una copia superficiale di una lista. Il metodo di slicing [:] è efficiente perché è implementato a basso livello in Python. Di seguito la sintassi di questo metodo.
new_list = original_list[:]
Il seguente codice stampa [1, 2, 3].
# Create a list called original_list
original_list = [1, 2, 3]
# Create a shallow copy of original_list using list slicing
copied_list = original_list[:]
# Modify the first element of copied_list
copied_list[0] = 99
print(original_list)
[1, 2, 3]
In questo contesto, usiamo lo slicing per includere tutto nella lista, ma in altri contesti lo slicing può essere usato per creare sotto-liste specificando indici di inizio e fine.
Copia superficiale vs. copia profonda in Python
Capire la differenza tra copia superficiale e copia profonda è importante per evitare trasformazioni dei dati non intenzionali.
- Una copia superficiale copia solo gli elementi al primo livello della lista e non isola le liste annidate o gli oggetti mutabili all'interno della lista che fanno riferimento agli stessi oggetti. Le modifiche effettuate negli oggetti mutabili influenzeranno sia la lista originale che quella copiata.
- La copia profonda copia ricorsivamente tutti gli elementi, incluse le liste annidate e gli oggetti mutabili, creando copie indipendenti. Le modifiche apportate agli oggetti annidati nella lista copiata non influenzeranno la lista originale.
Ti consiglio di usare la funzione copy.copy() per la copia superficiale e la funzione copy.deepcopy() per la copia profonda.
|
Metodo |
Copia superficiale |
Copia profonda |
|
copy() |
✓ |
✗ |
|
costruttore list() |
✓ |
✗ |
|
Slicing della lista [:] |
✓ |
✗ |
|
copy.copy() |
✓ |
✗ |
|
copy.deepcopy() |
✗ |
✓ |
Come copiare una lista annidata in Python
Quando gestisci liste annidate o strutture dati complesse, servono metodi più sofisticati per copiare le liste. Vediamo le diverse tecniche per gestire le liste annidate.
Usare copy.copy()
Il modulo copy fornisce la funzione copy() che crea una copia superficiale di una lista. La funzione copy() è più esplicita rispetto all'uso del costruttore list() o dello slicing [:]. Puoi usare questo metodo quando vuoi enfatizzare la creazione di una copia superficiale di una lista per migliorare la leggibilità.
L'esempio seguente mostra come effettuare una copia superficiale di una lista annidata. Il codice stamperà [1, 2, [99, 4]] perché la lista annidata è ancora lo stesso oggetto.
# Import the copy module to access the copy.copy() function
import copy
# Original list with nested structure
original_list = [1, 2, [3, 4]]
# Create a shallow copy using copy.copy()
shallow_copied_list = copy.copy(original_list)
# Modifying the nested list in the copied list
shallow_copied_list[2][0] = 99
print(original_list)
[1, 2, [99, 4]]
Usare copy.deepcopy()
La funzione deepcopy() è anch'essa disponibile nel modulo copy. Questa funzione crea una copia profonda della lista, duplicando la lista stessa e tutti gli oggetti annidati. La funzione deepcopy() è importante quando lavori con oggetti mutabili all'interno delle liste, perché garantisce che le modifiche nelle liste copiate non influenzino la lista originale.
Il codice seguente stampa [1, 2, [3, 4]].
# Import the copy module to access the copy.deepcopy() function
import copy
# Original list with nested structure
original_list = [1, 2, [3, 4]]
# Create a deep copy using copy.deepcopy()
deep_copied_list = copy.deepcopy(original_list)
# Modifying the nested list in the copied list
deep_copied_list[2][0] = 99
print(original_list)
[1, 2, [3, 4]]
Conclusione
Capire come copiare le liste in Python è importante per una manipolazione efficiente dei dati. In questo tutorial abbiamo visto diversi metodi per copiare una lista in Python ed esplorato alcune differenze tra copia superficiale e copia profonda. Come data analyst, è importante scegliere la tecnica di copia più adatta in base alle tue esigenze specifiche. Ti incoraggio a mettere in pratica i metodi discussi per comprenderne meglio i casi d'uso.
Segui lo skill track di DataCamp Python Programming per far crescere le tue capacità di programmazione con le tecniche migliori. Ti invito anche a dare un'occhiata ai nostri percorsi di carriera Python Developer e Data Analyst with Python per continuare a costruire competenze pratiche e rilevanti per il lavoro.
Domande frequenti
Qual è la differenza tra copia superficiale e copia profonda?
La copia superficiale crea una nuova lista ma mantiene riferimenti agli stessi valori della lista originale, per cui le modifiche agli oggetti nella lista copiata influenzano la lista originale. La copia profonda crea una nuova lista e inserisce ricorsivamente i valori dalla lista originale, quindi le modifiche agli oggetti annidati nella lista copiata non influenzano la lista originale.
Quali sono i metodi per creare una copia superficiale in Python?
Puoi creare una copia superficiale di una lista usando il metodo copy(), lo slicing [:], il costruttore list() o la funzione copy() del modulo copy.
Come si crea una copia profonda di una lista in Python?
Puoi creare una copia profonda di una lista usando la funzione deepcopy() del modulo copy.


