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 uporabocopy>
modul za ustvarjanje plitvih in globokih kopij ugnezdenega seznamali1>
. 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 kopijoli1>
, vključno z vsemi ugnezdenimi elementi. Koda natisne ID-je in vrednostili2>
inli3>
, 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 uporabocopy>
modul. Sprva natisne izvirne elementeli1>
, nato jih globoko kopira za ustvarjanjeli2>
. Sprememba elementa vli2>
ne vplivali1>
, kot je razvidno iz ločenih izpisov. To poudarja, kako globoko kopiranje ustvari neodvisno kopijo, ki ohranja vsebino izvirnega seznama tudi po spremembah kopije.
tabela ascii java
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> => ' '> )> |
>
>
natasha dalal
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 elementeli1>
, nato izvede plitvo kopiranje vli2>
. Spreminjanje elementa vli2>
vpliva na ustrezen element vli1,>
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