Assegnazione, copia superficiale o copia profonda?

Assegnazione variabile

Dice nella documentazione Python che “Le istruzioni di assegnazione in Python non copiano oggetti, creano collegamenti tra un target e un oggetto.” Che significa che quando si crea una variabile di assegnazione, la nuova variabile si riferisce allo stesso oggetto della variabile originale fa —

>>> A = , 3, ]>>> B = A>>> id(A)
3061527080>>> id(B)
3061527080

Perché la nuova variabile B e la variabile originale A condividono lo stesso oggetto (per esempio, la stessa lista), contengono anche elementi —

>>> id(A)
3061527368>>> id(B)
3061527368

Come illustrato nella figura sottostante, A e B condividono la stessa id, cioè, che si riferiscono allo stesso oggetto in memoria. E contengono anche gli stessi elementi.,

Copia Superficiale

Quando si crea una variabile da copia superficiale, la nuova variabile fa riferimento a un nuovo oggetto —

>>> A = , 3, ]>>> C = copy(A)>>> id(A)
3062428488>>> id(C)
3062428520

anche se A e C si riferisce a due oggetti diversi (es., due elenchi con indirizzi di memoria diversi), gli elementi nei due elenchi si riferiscono agli stessi oggetti –

>>> id(A)
2301696>>> id(C)
2301696>>> id(A)
3062464904>>> id(C)
3062464904

La figura seguente illustra come gli elementi inAsi riferiscono agli stessi oggetti degli elementi inC.,>

Copia Profonda

Simile a una copia superficiale, quando si crea una variabile da copia profonda, la nuova variabile fa riferimento a un nuovo oggetto —

>>> A = , 3, ]>>> D = deepcopy(A)>>> id(A)
3062727496>>> id(D)
3062428488

Come descritto nella documentazione di Python —

La differenza tra profonde, la copia è rilevante solo per il compound objects (oggetti che contengono altri oggetti, come le liste o le istanze di classe):

– Una copia superficiale costruisce un nuovo composto di un oggetto e quindi (per quanto possibile) inserisce i riferimenti in esso per oggetti presenti nell’originale.,

– Una copia profonda costruisce un nuovo oggetto composto e quindi, ricorsivamente, inserisce copie degli oggetti trovati nell’originale.

Così diverso da copia superficiale, elementi nei due elenchi ora fare riferimento a oggetti diversi —

>>> id(A)
2301696>>> id(D)
2301696>>> id(A)
3062464648>>> id(D)
3062466376

Ma perché A e D condividono lo stesso oggetto (cioè hanno lo stesso indirizzo di memoria)? Perché entrambi si riferiscono a numeri interi, che è una delle tre eccezioni dovute all’ottimizzazione della memoria che abbiamo menzionato all’inizio.,

La figura seguente mostra A e D si riferiscono a due elenchi diversi in memoria, e gli elementi in A si riferiscono a oggetti diversi dagli elementi in D ad eccezione degli elementi interi all’ottimizzazione della memoria.

Sommario

Se c’è un take-away da questo articolo, deve essere la tabella di seguito., L’assegnazione delle variabili non copia gli oggetti, quindi A e B hanno lo stesso indirizzo di memoria e contengono gli stessi elementi. Shallow copy crea un nuovo oggetto per C, ma gli elementi in C si riferiscono ancora agli stessi oggetti degli elementi in A. Deep copy crea anche un nuovo oggetto perD, e gli elementi inD si riferiscono a oggetti diversi da quelli inA con tre tipi di eccezioni.,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *