logo

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 naudoticopy>modulį, kad sukurtumėte ir seklias, ir gilias įdėto sąrašo kopijasli1>. 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 kopijali1>, įskaitant visus įdėtus elementus. Kodas atspausdina ID ir reikšmesli2>irli3>, 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ą naudojantcopy>modulis. Iš pradžių spausdinami originalūs elementaili1>, tada giliai nukopijuoja juos, kad sukurtųli2>. Elemento modifikacijali2>neturi įtakosli1>, kaip rodo atskiri spaudiniai. Tai pabrėžia, kaip gilus kopijavimas sukuria nepriklausomą kopiją, išsaugant pradinio sąrašo turinį net ir pakeitus kopiją.

sdlc

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 elementaili1>, tada atlieka negilų kopijavimą įli2>. Elemento modifikavimasli2>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

dvejetainis medis




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