lettura facile

Il metodo copy() di Python

In Python, il metodo copy() ti permette di creare una copia di un oggetto, come una lista o un dizionario.

oggetto.copy()

Dove "oggetto" è il nome della variabile che contiene l'oggetto. Può essere una lista, un dizionario, ecc.

E' molto utile se vuole lavorare con la copia senza modificare l'originale.

Il metodo copy applicato alle liste

Ecco un esempio pratico.

Crea una lista nella variabile "lista".

lista = [1, 2, 3, 4]

Poi crea una copia della lista tramite il metodo copy() e assegnala alla variabile "lista_copia"

lista_copia = lista.copy()

Python crea una copia della lista nella seconda variabile.

Ora modifica la copia della lista aggiungendo un elemento tramite il metodo append().

lista_copia.append(5)

Quando modifichi la lista_copia, lista originale non viene modificata.

Se stampi il contenuto della lista originale, questa è ancora composta da quattro elementi.

print(lista)

[1, 2, 3, 4]

Viceversa, se stampi il contenuto della seconda lista, questa è composta da cinque elementi.

print(lista_copia)

[1, 2, 3, 4, 5]

Ricorda, però, che il metodo copy() esegue soltanto una copia superficiale (shallow copy).

Questo vuol dire che se l'oggetto originale contiene riferimenti ad altri oggetti (come una lista di liste), solo i riferimenti vengono copiati, non gli oggetti stessi.

Ad esempio, crea una lista di liste.

lista = [[1, 2, 3], [4, 5, 6]]

Poi copia la lista con il metodo copy()

lista_copia = lista.copy()

In questo caso la copia si limita a copiare i riferimenti delle strutture interne e non i singoli valori.

Ora modifica un elemento della variabile lista_copia.

lista_copia[0][0] = 9

In questo caso la modifica si ripercuote sia sulla lista_copia che sulla lista originale.

print(lista_copia)

[[9, 2, 3], [4, 5, 6]]

print(lista)

[[9, 2, 3], [4, 5, 6]]

Se vuoi effettuare una copia profonda (deep copy) delle liste, che crea copie anche degli oggetti interni, utilizzare il metodo copy e la sua funzione deepcopy()

Ad esempio, crea di nuovo la lista delle liste.

lista = [[1, 2, 3], [4, 5, 6]]

Per prima cosa importa tutte le funzioni del metodo copy

import copy

Poi esegui una copia profonda della lista.

lista_copia = copy.deepcopy(lista)

Ora modifica il contenuto della lista copia

lista_copia[0][0] = 9

In questo caso, quando modifichi un elemento interno della lista_copia, l'elemento corrispondente nella lista originale non viene modificato.

print(lista_copia)

[[9, 2, 3], [4, 5, 6]]

print(lista)

[[1, 2, 3], [4, 5, 6]]

Il metodo copy sui dizionari

Quando chiami il metodo copy da un dizionario, il metodo crea una copia superficiale del dizionario.

Ad esempio, definisci un dizionario

dizionario_originale = {'nome': 'Mario', 'età': 30, 'città': 'Roma'}

Poi usa il metodo copy per creare una copia del dizionario

dizionario_copia = dizionario_originale.copy()

A questo punto modifica qualche dato nella copia del dizionario

dizionario_copia['età'] = 35

Ora stampa entrambi i dizionari per vedere la differenza. Stampa il dizionario originale.

print("Dizionario Originale:", dizionario_originale)

Dizionario Originale: {'nome': 'Mario', 'età': 30, 'città': 'Roma'}

Poi stampa il dizionario copiato

print("Dizionario Copia:", dizionario_copia)

Dizionario Copia: {'nome': 'Mario', 'età': 35, 'città': 'Roma'}

In questo esempio, modificando dizionario_copia, non si altera dizionario_originale.

Questo dimostra che la copia è indipendente dall'originale.

Tuttavia, è importante ricordarsi che questo è valido solo per copie superficiali.

Per gli oggetti annidati all'interno del dizionario, entrambi i dizionari (originale e copia) fanno riferimento allo stesso oggetto.

Quindi, se modifichi un un oggetto annidato (es. una lista dentro il dizionario), questa azione modifica entrambi i dizionari.

Ad esempio, definisci un dizionario con un oggetto annidato (un altro dizionario)

dizionario_originale = {
'nome': 'Mario',
'età': 30,
'indirizzo': {
'via': 'Via Roma',
'numero': 10
}
}

Poi crea una copia superficiale

dizionario_copia = dizionario_originale.copy()

Modifica dell'oggetto annidato nella copia

dizionario_copia['indirizzo']['via'] = 'Via Milano'

Ora stampa il dizionario originale

print("Dizionario Originale:", dizionario_originale)

Dizionario Originale: {'nome': 'Mario', 'età': 30, 'indirizzo': {'via': 'Via Milano', 'numero': 10}}

Poi stampa il dizionario copiato

print("Dizionario Copia:", dizionario_copia)

Dizionario Copia: {'nome': 'Mario', 'età': 30, 'indirizzo': {'via': 'Via Milano', 'numero': 10}}

In questo esempio, la modifica dell'oggetto annidato (indirizzo) nel dizionario_copia influenza anche il dizionario_originale.

Questo accade perché la copia superficiale copia solo il riferimento all'oggetto annidato, non l'oggetto annidato stesso.

Per evitare questo comportamento, sarebbe necessario fare una "copia profonda" utilizzando il modulo copy e il suo metodo deepcopy.




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin