kopiraj v Python (globoko kopiranje in plitko kopiranje)
noter Python , Stavki o dodelitvi ne kopirajo objektov, temveč ustvarijo vezi med ciljem in objektom. Ko uporabljamo = ustvari le novo spremenljivko, ki ima skupno referenco izvirnega objekta. Za ustvarjanje pravih kopij ali klonov teh predmetov lahko uporabimo modul za kopiranje v Python .
Sintaksa Python Deepcopy
Sintaksa: copy.deepcopy(x)
Sintaksa Python Shallowcopy
Sintaksa: copy.copy(x)
primer:
Za izdelavo teh kopij uporabljamo modul za kopiranje. Copy() vrne plitvo kopijo seznama, deepcopy() pa vrne globoko kopijo seznama. Kot lahko vidite, imata oba enako vrednost, vendar različna ID-ja.
primer: Ta koda prikazuje uporabo copy> modul za ustvarjanje plitvih in globokih kopij ugnezdenega seznama li1> . Plitka kopija, li2> , je ustvarjen z uporabo copy.copy()> , ohranja strukturo najvišje ravni, vendar deli sklicevanja na notranje sezname. Globoka kopija, li3> , je ustvarjen z uporabo copy.deepcopy()> , kar je povzročilo popolnoma neodvisno kopijo li1> , vključno z vsemi ugnezdenimi elementi. Koda natisne ID-je in vrednosti li2> in li3> , ki poudarja razliko med plitvimi in globokimi kopijami v smislu referenčnosti in neodvisnosti.
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)> |
Izhod:
li2 ID: 2521878674624 Value: [1, 2, [3, 5], 4] li3 ID: 2521878676160 Value: [1, 2, [3, 5], 4]
Kaj je globoka kopija v Pythonu?
Globoka kopija ustvari nov sestavljen objekt, preden vanj na rekurziven način vstavi kopije elementov, ki jih najdemo v izvirniku. To pomeni, da najprej zgradite nov objekt zbirke in ga nato rekurzivno napolnite s kopijami podrejenih objektov, ki jih najdete v izvirniku. V primeru globoke kopije se kopija predmeta prekopira v drug objekt. To pomeni, da morebitne spremembe narejena na kopijo predmeta ne odražajo v izvirnem predmetu.
primer:
V zgornjem primeru je sprememba na seznamu ni vplivalo drugi seznami, kar pomeni, da je seznam globoko kopiran.
Ta koda ponazarja globoko kopiranje seznama z ugnezdenimi elementi z uporabo copy> modul. Sprva natisne izvirne elemente li1> , nato jih globoko kopira za ustvarjanje li2> . Sprememba elementa v li2> ne vpliva li1> , kot je razvidno iz ločenih izpisov. To poudarja, kako globoko kopiranje ustvari neodvisno kopijo, ki ohranja vsebino izvirnega seznama tudi po spremembah kopije.
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> => ' '> )> |
Izhod:
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
Kaj je plitka kopija v Pythonu?
Plitka kopija ustvari nov sestavljeni objekt in se nato v njem sklicuje na objekte, ki jih vsebuje izvirnik, kar pomeni, da sestavi nov objekt zbirke in ga nato zapolni s sklici na podrejene objekte, najdene v izvirniku. Postopek kopiranja se ne ponavlja in zato ne bo ustvaril kopij samih podrejenih predmetov. V primeru plitve kopije se sklic na objekt prekopira v drug objekt. To pomeni, da morebitne spremembe narejena v kopijo predmeta odražaj v izvirnem predmetu. V pythonu je to implementirano z uporabo kopirati() funkcijo.
primer:
V tem primeru je sprememba na seznamu vplivalo drug seznam, kar pomeni, da je seznam plitko kopiran. Pomembne točke: Razlika med plitkim in globokim kopiranjem je pomembna samo za sestavljene objekte (objekte, ki vsebujejo druge predmete, kot so seznami ali primerki razreda):
- Plitka kopija sestavi nov sestavljen objekt in nato (kolikor je to mogoče) vanj vstavi sklice na predmete, ki jih najdemo v izvirniku.
- Globoka kopija sestavi nov sestavljeni objekt in nato rekurzivno vanj vstavi kopije objektov, najdenih v izvirniku.
primer: Ta koda prikazuje plitvo kopiranje seznama z ugnezdenimi elementi z uporabo ' copy'> modul. Na začetku natisne izvirne elemente li1> , nato izvede plitvo kopiranje v li2> . Spreminjanje elementa v li2> vpliva na ustrezen element v li1,> saj si oba seznama delita reference na notranje sezname. To ponazarja, da plitvo kopiranje ustvari nov seznam, vendar ne zagotavlja popolne neodvisnosti za ugnezdene elemente.
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> => ' '> )> |
Izhod:
The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4
PRIPOROČENI ČLANKI – Razlika med plitko in globoko kopijo razreda