atribuire, copie superficială sau copie profundă?

atribuire variabilă

se spune în documentația Python că „declarațiile de atribuire în Python nu copiază obiecte, ele creează legături între o țintă și un obiect.”Asta înseamnă că atunci când vom crea o variabilă prin cesiune, noul variabilă se referă la același obiect ca variabila originală nu —

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

Pentru noua variabilă B și variabila originală A partaja același obiect (de exemplu,, aceeași listă), au, de asemenea, să conțină aceleași elemente —

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

Cum este ilustrat în figura de mai jos, A și B împărtășesc aceeași id, de exemplu, se referă la același obiect în memorie. Și ele conțin aceleași elemente, de asemenea.,

Copie Superficială

Atunci când vom crea o variabilă de copie superficială, noua variabilă se referă la un obiect nou —

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

Desi A și C se referă la două obiecte diferite (de exemplu,, două liste cu diferite adrese de memorie), elemente din cele două liste se referă la aceleași obiecte,

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

figura De mai jos ilustrează modul în care elementele în A se referă la aceleași obiecte și elemente în C.,>

Copie Profundă

Similar cu copie superficială, atunci când vom crea o variabilă de copie profundă, noua variabilă se referă la un obiect nou —

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

după Cum este descris în Python documentare —

diferența între suprafață și adâncime copierea este relevantă numai pentru compusul obiecte (obiecte care conțin alte obiecte, cum ar fi liste sau cazuri de clasă):

– O copie superficială construiește un nou compus obiect și apoi (în măsura posibilului) inserează referințe de obiecte găsite în original.,

– o copie profundă construiește un nou obiect compus și apoi, recursiv, introduce copii în El ale obiectelor găsite în original.

Atât de diferit de copie superficială, elemente din cele două liste se referă acum la diferite obiecte —

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

Dar de ce A și D partaja același obiect (adică au aceeași adresă de memorie)? Pentru că ambele se referă la numere întregi, care este una dintre cele trei excepții datorate optimizării memoriei pe care am menționat-o la început.,

figura De mai jos arată A și D se referă la două liste diferite în memorie, și elemente A se referă la obiecte diferite decât elementele în D cu excepția număr întreg de elemente din cauza optimizare de memorie.

Sumar

Dacă există un singur lucru din acest articol, trebuie să fie tabelul de mai jos., Variabilei nu copia obiecte, deci A și B au aceeași adresă de memorie și conțin aceleași elemente. Copie superficială creează un obiect nou pentru C, dar elementele în C încă se referă la aceleași obiecte și elemente în A. Copie profundă, de asemenea, creează un obiect nou pentru D, iar elementele în D se referă la obiecte diferite decât acele elemente A cu trei tipuri de excepții.,

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *