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 inA
si 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.,