copiați în Python (Deep Copy și Shallow Copy)

copiați în Python (Deep Copy și Shallow Copy)

În Piton , Declarațiile de atribuire nu copiază obiecte, ele creează legături între o țintă și un obiect. Când folosim = operator, creează doar o nouă variabilă care împărtășește referința obiectului original. Pentru a crea copii reale sau clone ale acestor obiecte, putem folosi modulul de copiere în Piton .

Sintaxa lui Python Deepcopy

Sintaxă: copy.deepcopy(x)

Sintaxa lui Python Shallowcopy

Sintaxă: copy.copy(x)

Exemplu:

Pentru a face aceste copii, folosim modulul de copiere. Copy() returnează o copie superficială a listei, iar deepcopy() returnează o copie profundă a listei. După cum puteți vedea, ambele au aceeași valoare, dar au ID-uri diferite.

Exemplu: Acest cod prezintă utilizarea copy> modul pentru a crea atât copii superficiale, cât și profunde ale unei liste imbricate li1> . O copie superficială, li2> , este creat folosind copy.copy()> , păstrând structura de nivel superior, dar partajând referințe la listele interioare. O copie profundă, li3> , este creat folosind copy.deepcopy()> , rezultând o copie complet independentă a li1> , inclusiv toate elementele imbricate. Codul imprimă ID-urile și valorile li2> și li3> , subliniind distincția dintre copiile superficiale și cele adânci în ceea ce privește referința și independența.

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'li2 ID: '> ,> id> (li2),> 'Value: '> , li2)> li3> => copy.deepcopy(li1)> print> (> 'li3 ID: '> ,> id> (li3),> 'Value: '> , li3)>

Ieșire:

  li2 ID:   2521878674624   Value:   [1, 2, [3, 5], 4]   li3 ID:   2521878676160   Value:   [1, 2, [3, 5], 4] 

Ce este Deep copy în Python?

O copie profundă creează un nou obiect compus înainte de a insera în el copii ale elementelor găsite în original într-o manieră recursivă. Înseamnă mai întâi construirea unui nou obiect de colecție și apoi popularea recursiv cu copii ale obiectelor copil găsite în original. În cazul copierii profunde, o copie a obiectului este copiată într-un alt obiect. Înseamnă că orice modificari făcută la o copie a obiectului nu se reflectă în obiectul original.

Copie profundă în Python

Exemplu:

În exemplul de mai sus, modificarea făcută în listă nu a afectat alte liste, indicând că lista este copiată profund.

Acest cod ilustrează copierea profundă a unei liste cu elemente imbricate folosind copy> modul. Tipărește inițial elementele originale ale li1> , apoi deep le copiază pentru a le crea li2> . O modificare a unui element din li2> nu afectează li1> , după cum se demonstrează prin imprimările separate. Acest lucru evidențiază cât de multă copiere creează o copie independentă, păstrând conținutul listei originale chiar și după modificările aduse copiei.

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.deepcopy(li1)> print> (> 'The original elements before deep copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> ' '> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The new list of elements after deep copying '> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li2[i],end> => ' '> )> print> (> ' '> )> print> (> 'The original elements after deep copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )>

Ieșire:

The original elements before deep copying 1 2 [3, 5] 4 The new list of elements after deep copying 1 2 [7, 5] 4 The original elements after deep copying 1 2 [3, 5] 4 

Ce este copierea superficială în Python?

O copie superficială creează un nou obiect compus și apoi face referire la obiectele conținute în original, ceea ce înseamnă că construiește un nou obiect de colecție și apoi îl populează cu referințe la obiectele copil găsite în original. Procesul de copiere nu se repetă și, prin urmare, nu va crea copii ale obiectelor copil în sine. În cazul copierii superficiale, o referință a unui obiect este copiată într-un alt obiect. Înseamnă că orice modificari făcută la o copie a unui obiect reflecta în obiectul original. În python, acest lucru este implementat folosind copie() funcţie.

Copie superficială în Python

Exemplu:

În acest exemplu, modificarea făcută în listă a afectat altă listă, indicând că lista este copiată superficial. Puncte importante: Diferența dintre copierea superficială și cea profundă este relevantă numai pentru obiectele compuse (obiecte care conțin alte obiecte, cum ar fi liste sau instanțe de clasă):

  • O copie superficială construiește un nou obiect compus și apoi (în măsura posibilului) inserează referințe în el la obiectele găsite în original.
  • O copie profundă construiește un nou obiect compus și apoi, recursiv, inserează în el copii ale obiectelor găsite în original.

Exemplu: Acest cod demonstrează copierea superficială a unei liste cu elemente imbricate folosind ' copy'> modul. Inițial, imprimă elementele originale ale li1> , apoi efectuează o copiere superficială în li2> . Modificarea unui element în li2> afectează elementul corespunzător în li1,> întrucât ambele liste împărtășesc referințe la listele interioare. Acest lucru ilustrează faptul că copierea superficială creează o nouă listă, dar nu oferă independență completă pentru elementele imbricate.

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'The original elements before shallow copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> ' '> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The original elements after shallow copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )>

Ieșire:

The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4 

ARTICOLE RECOMANDATE Diferența dintre copierea superficială și cea adâncă a unei clase