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