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

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.

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