Python Shallow Copy și Deep Copy
copiați un obiect în Python
în Python, folosim operatorul =
pentru a crea o copie a unui obiect. S-ar putea să credeți că acest lucru creează un obiect nou; nu. creează doar o variabilă nouă care împărtășește Referința obiectului original.
Să luăm un exemplu în care vom crea o lista de nume old_list și să treacă un obiect de referință pentru new_list folosind =
operator.,
Exemplul 1: Copierea folosind = operator
atunci Când vom rula de program de mai sus, rezultatul va fi:
Old List: , , ]ID of Old List: 140673303268168New List: , , ]ID of New List: 140673303268168
după Cum puteți vedea de la ieșirea ambele variabile old_list și new_list împărtășește aceeași identitate.e 140673303268168
.deci, dacă doriți să modificați orice valori în new_list sau old_list, modificarea este vizibilă în ambele.
în esență, uneori poate doriți să aveți valorile originale neschimbate și să modificați doar noile valori sau invers., În Python, există două moduri de a crea copii:
- copie superficială
- copie profundă
pentru a face aceste copii să funcționeze, folosim modululcopy
.
modul de copiere
folosim modulul copy
din Python pentru operații de copiere superficiale și profunde. Să presupunem că, aveți nevoie pentru a copia compus lista spun x. De exemplu:
import copycopy.copy(x)copy.deepcopy(x)
Aici, copy()
returna o copie superficială a x. În mod similar, deepcopy()
returna o copie profundă a x.,o copie superficială creează un obiect nou care stochează referința elementelor originale.deci, o copie superficială nu creează o copie a obiectelor imbricate, ci doar copiază referința obiectelor imbricate. Aceasta înseamnă că un proces de copiere nu recursează și nu creează copii ale obiectelor imbricate în sine.,
Exemplul 2: Creați o copie folosind copie superficială
import copyold_list = , , ]new_list = copy.copy(old_list)print("Old list:", old_list)print("New list:", new_list)
atunci Când vom rula programul , ieșirea va fi:
Old list: , , ]New list: , , ]
În program de mai sus, am creat o listă imbricată și apoi superficial copiați-l folosind copy()
metoda.acest lucru înseamnă că va crea obiect nou și independent, cu același conținut. Pentru a verifica acest lucru, tipărim atât old_list, cât și new_list.,
Pentru a confirma că new_list este diferit de old_list, vom încerca pentru a adăuga noi obiecte imbricate originale și verificați-l.
Exemplul 3: Adăugarea la old_list, folosind copie superficială
atunci Când vom rula programul, se va afișa:
Old list: , , , ]New list: , , ]
În programul de mai sus, am creat o copie superficială a old_list. New_list conține referințe la obiecte imbricate originale stocate în old_list. Apoi adăugăm noua listă, adică în old_list., Această nouă sublistă nu a fost copiată în new_list.cu toate acestea, atunci când modificați orice obiecte imbricate în old_list, modificările apar în new_list.
Exemplul 4: Adăugarea de noi obiecte imbricate folosind copie Superficială
import copyold_list = , , ]new_list = copy.copy(old_list)old_list = 'AA'print("Old list:", old_list)print("New list:", new_list)
atunci Când vom rula programul, se va afișa:
Old list: , , ]New list: , , ]
Copie Profundă
O copie profundă creează un obiect nou și recursiv adaugă copiile de obiecte imbricate prezente în elementele originale.
să continuăm cu exemplul 2., Cu toate acestea, vom crea copie profundă folosind deepcopy()
funcția prezentă în copy
modul. Copia profundă creează o copie independentă a obiectului original și a tuturor obiectelor sale imbricate.
Exemplul 5: Copierea unei liste folosind deepcopy()
import copyold_list = , , ]new_list = copy.deepcopy(old_list)print("Old list:", old_list)print("New list:", new_list)
atunci Când vom rula programul, se va afișa:
Old list: , , ]New list: , , ]
În programul de mai sus, vom folosi deepcopy()
funcția de a crea copie care pare similar.,
cu toate acestea, dacă faceți modificări la orice obiecte imbricate din original object old_list, nu veți vedea nicio modificare la copy new_list.
Exemplul 6: Adăugarea unui nou obiect imbricate în lista folosind copie Profundă
atunci Când vom rula programul, se va afișa:
Old list: , , ]New list: , , ]
În programul de mai sus, când atribuim o valoare nouă pentru old_list, putem vedea doar old_list este modificat. Aceasta înseamnă că atât old_list, cât și new_list sunt independente. Acest lucru se datorează faptului că old_list a fost copiat recursiv, ceea ce este valabil pentru toate obiectele sale imbricate.