kopija „Python“ (gili kopija ir sekli kopija)

kopija „Python“ (gili kopija ir sekli kopija)

Į Python , Priskyrimo sakiniai nekopijuoja objektų, jie sukuria susiejimą tarp tikslo ir objekto. Kai mes naudojame = operatorius, sukuria tik naują kintamąjį, kuris dalijasi pradinio objekto nuoroda. Norėdami sukurti tikras šių objektų kopijas ar klonus, galime naudoti kopijavimo modulį Python .

Python Deepcopy sintaksė

Sintaksė: copy.deepcopy(x)

Python Shallowcopy sintaksė

Sintaksė: kopija.kopija(x)



Pavyzdys:

Norėdami padaryti šias kopijas, naudojame kopijavimo modulį. Copy() grąžina seklią sąrašo kopiją, o deepcopy() – gilią sąrašo kopiją. Kaip matote, abu turi tą pačią vertę, bet turi skirtingus ID.

Pavyzdys: Šis kodas parodo, kaip naudoti copy> modulį, kad sukurtumėte ir seklias, ir gilias įdėto sąrašo kopijas li1> . Sekli kopija, li2> , sukurta naudojant copy.copy()> , išsaugant aukščiausio lygio struktūrą, bet dalijantis nuorodomis į vidinius sąrašus. Gili kopija, li3> , sukurta naudojant copy.deepcopy()> , todėl gaunama visiškai nepriklausoma kopija li1> , įskaitant visus įdėtus elementus. Kodas atspausdina ID ir reikšmes li2> ir li3> , pabrėžiant skirtumą tarp seklių ir gilių kopijų atskaitos ir nepriklausomumo požiūriu.

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)>

Išvestis:

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

Kas yra gilioji kopija Python?

Gilioji kopija sukuria naują sudėtinį objektą prieš įterpiant originale rastų elementų kopijas rekursiniu būdu. Tai reiškia, kad pirmiausia reikia sukurti naują kolekcijos objektą, o paskui jį rekursyviai užpildyti antrinių objektų, rastų originale, kopijomis. Giliosios kopijos atveju objekto kopija nukopijuojama į kitą objektą. Tai reiškia kad bet kokius pakeitimus padaryta į objekto kopiją neatsispindi pirminiame objekte.

Gilioji kopija Python

Pavyzdys:

Aukščiau pateiktame pavyzdyje sąraše atliktas pakeitimas įtakos neturėjo kitus sąrašus, nurodant, kad sąrašas yra labai nukopijuotas.

Šis kodas iliustruoja išsamų sąrašo su įdėtais elementais kopijavimą naudojant copy> modulis. Iš pradžių spausdinami originalūs elementai li1> , tada giliai nukopijuoja juos, kad sukurtų li2> . Elemento modifikacija li2> neturi įtakos li1> , kaip rodo atskiri spaudiniai. Tai pabrėžia, kaip gilus kopijavimas sukuria nepriklausomą kopiją, išsaugant pradinio sąrašo turinį net ir pakeitus kopiją.

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> => ' '> )>

Išvestis:

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 

Kas yra sekli kopija Python?

Sekli kopija sukuria naują sudėtinį objektą, o tada nurodo jame esančius objektus, o tai reiškia, kad sukuriamas naujas kolekcijos objektas ir užpildomas nuorodomis į antrinius objektus, esančius originale. Kopijavimo procesas nesikartoja, todėl nebus sukurtos pačių antrinių objektų kopijos. Seklios kopijos atveju objekto nuoroda nukopijuojama į kitą objektą. Tai reiškia kad bet kokius pakeitimus padaryta prie objekto kopijos atspindėti pirminiame objekte. Python tai įgyvendinama naudojant kopija () funkcija.

Sekli kopija Python

Pavyzdys:

Šiame pavyzdyje sąraše atliktas pakeitimas padarė įtaką kitą sąrašą, nurodant, kad sąrašas yra negiliai nukopijuotas. Svarbūs punktai: Skirtumas tarp sekliojo ir gilaus kopijavimo svarbus tik sudėtiniams objektams (objektams, kuriuose yra kitų objektų, pvz., sąrašų ar klasių egzempliorių):

  • Sekli kopija sukuria naują sudėtinį objektą ir tada (kiek įmanoma) į jį įterpia nuorodas į originale rastus objektus.
  • Gilioji kopija sukuria naują sudėtinį objektą ir tada rekursyviai įterpia į jį originale rastų objektų kopijas.

Pavyzdys: Šis kodas demonstruoja seklų sąrašo su įdėtais elementais kopijavimą naudojant ' copy'> modulis. Iš pradžių spausdinami originalūs elementai li1> , tada atlieka negilų kopijavimą į li2> . Elemento modifikavimas li2> paveikia atitinkamą elementą li1,> nes abiejuose sąrašuose yra nuorodos į vidinius sąrašus. Tai iliustruoja, kad seklus kopijavimas sukuria naują sąrašą, bet neužtikrina visiško įdėtųjų elementų nepriklausomybės.

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> => ' '> )>

Išvestis:

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

REKOMENDUOJAMI STRAIPSNIAI Skirtumas tarp seklios ir gilios klasės kopijos



Top Straipsniai

Kategorija

Įdomios Straipsniai