Introduzione
In questo tutorial, discuteremo delle copie shallow vs deep copies con l’aiuto di esempi in Python. Tratteremo la definizione di una copia profonda e superficiale, insieme alla sua implementazione nel linguaggio Python per valutare le differenze principali tra i due tipi di copie.
In molti dei programmi che scriviamo, non importa quanto siano basilari, finiamo per dover copiare una lista o un oggetto per una delle molte ragioni, come l’efficienza computazionale., Ci sono due modi per farlo, o fare una copia profonda o una copia superficiale. Prima di discutere le differenze tra i due, prima capiamo quali sono esattamente le copie profonde e superficiali.
Deep Copies in Python
Una deep copy crea una copia nuova e separata di un intero oggetto o elenco con il proprio indirizzo di memoria univoco. Ciò significa che tutte le modifiche apportate nella nuova copia dell’oggetto / elenco non si rifletteranno in quella originale. Questo processo avviene creando prima un nuovo elenco o oggetto, seguito dalla copia ricorsiva degli elementi da quello originale a quello nuovo.,
Per dirla in breve, entrambi gli oggetti sono completamente indipendenti l’uno dall’altro. Questo è simile al concetto di passare per valore in linguaggi come C++, Java e C#.
Deep Copy Example
Per implementare il concetto di deep copies in Python, useremo il modulo copy.
Diciamo che abbiamo un elenco di liste chiamatoresult_A
, che contiene i voti dello studente A in 3 materie per i primi due anni di scuola, e desideriamo creare un elenco di risultati esattamente simile anche per lo studente B., Cercheremo di fare una copia completa del result_A
elenco e fare un paio di cambiamenti profondi copia successivamente per mostrare le qualità di studente B.
Esempio 1:
lo script di cui sopra, usiamo il tag deepcopy
metodo copy
modulo per copiare list result_A
result_B
. Successivamente, stampiamo il contenuto di entrambi gli elenchi sullo schermo.
Output:
, ], ]
Come puoi vedere, gli elenchi sono identici. Più avanti in questo articolo vedremo come questo è diverso dalle copie poco profonde.,
Copie superficiali in Python
Una copia superficiale crea anche un nuovo oggetto oggetto o elenco separato, ma invece di copiare gli elementi figlio nel nuovo oggetto, copia semplicemente i riferimenti ai loro indirizzi di memoria. Quindi, se si apporta una modifica nell’oggetto originale, si rifletterebbe nell’oggetto copiato e viceversa. Per dirla in breve, entrambe le copie dipendono l’una dall’altra. Questo è simile al concetto di passaggio per riferimento in linguaggi di programmazione come C++, C# e Java.,
Esempio di copia superficiale
Per implementare questo in Python, useremo di nuovo il modulocopy
, ma questa volta chiameremo la sua funzionecopy
.
Usiamo lo stesso elenco di esempi anche per l’esempio di copia superficiale.
Esempio 2:
# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)
lo script di cui sopra, usiamo il tag copy
metodo copy
modulo per effettuare una copia superficiale della lista result_A
che si chiama result_B
., Successivamente, il contenuto di entrambi gli elenchi è stato stampato sulla console.
Output:
, ], ]
Ancora una volta, gli elenchi sono gli stessi, come previsto. Successivamente spiegheremo la differenza tra i risultati che otteniamo dalle funzionicopy
edeepcopy
.
Differenza tra copie profonde e poco profonde
Ora che abbiamo discusso quali sono le copie superficiali e profonde e perché creiamo copie, è il momento di parlare della differenza tra loro., Essenzialmente, ci sono due principali differenze e sono collegati tra di loro:
- copia completa di negozi di copie di un oggetto valori, mentre una copia superficiale storie riferimenti all’originale indirizzo di memoria
- Profondità di copia non riflette le modifiche apportate al nuovo/oggetto copiato in originale oggetto; che, in copia superficiale fa
Prima di passare all’attuazione, Mi piacerebbe immaginare questo scenario. Diciamo che due persone desiderano condividere un drink; hanno due bicchieri vuoti e due cannucce., Possono condividere questa bevanda in due modi:
- Mettere la bevanda in un bicchiere e mettere entrambe le cannucce in quel bicchiere per condividere
- Mettere la bevanda in entrambi i bicchieri e mettere una cannuccia in ogni bicchiere
Il primo scenario è quello di una copia poco profonda. Entrambe le variabili / istanze puntano / utilizzano la stessa posizione di memoria per le loro operazioni. Il secondo scenario è quello di una copia profonda. Entrambe le variabili / istanze puntano a / utilizzano due diverse posizioni di memoria per le loro operazioni.,
Esempio di confronto
Per rendere chiara la differenza, usiamo queste informazioni nei nostri due esempi precedenti, iniziando dall’esempio 1.
Sopra, abbiamo creato la listaresult_A
e ne abbiamo fatto una copia profonda denominataresult_B
. Proviamo a cambiare il contenuto in result_B
e vediamo se ha qualche effetto sul contenuto di result_A
.
Output:
Original List:, ]Deep Copy:, ]
Il risultato atteso è che l’elenco originale rimane invariato., E come puoi vedere, le modifiche nella copia profonda non hanno influenzato l’elenco originale.
Ora, proviamo la stessa cosa con l’esempio 2 – Copia superficiale.
Output:
Original List:, ]Shallow Copy:, ]
Qui il risultato atteso è che sia l’elenco originale che l’elenco copiato vengono modificati dopo la singola modifica. E come puoi vedere, apportare la modifica alla copia superficiale ha comportato che la modifica si riflettesse anche nell’elenco originale.
Conclusione
In questo post, abbiamo parlato di cosa sia una copia superficiale e profonda e di come possiamo realizzarli in linguaggio Python usando il modulo ‘copia’., Abbiamo usato due delle sue funzioni, ad esempiocopy
edeepcopy
per creare rispettivamente copie superficiali e profonde. Inoltre, abbiamo discusso le due differenze principali tra una copia superficiale e una profonda, e abbiamo anche implementato una copia superficiale e profonda in python per comprendere tali differenze in un modo migliore.