Į 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