In Python , Príkazy priradenia nekopírujú objekty, ale vytvárajú väzby medzi cieľom a objektom. Keď použijeme = vytvorí iba novú premennú, ktorá zdieľa odkaz pôvodného objektu. Aby sme vytvorili skutočné kópie alebo klony týchto objektov, môžeme použiť kopírovací modul v Python .
Syntax Python Deepcopy
Syntax: copy.deepcopy(x)
Syntax Python Shallowcopy
Syntax: copy.copy(x)
Príklad:
Na vytvorenie týchto kópií používame modul kopírovania. Kópia() vráti plytkú kópiu zoznamu a deepcopy() vráti hlbokú kópiu zoznamu. Ako vidíte, oba majú rovnakú hodnotu, ale majú rôzne ID.
Príklad: Tento kód ukazuje použitiecopy>modul na vytváranie plytkých aj hlbokých kópií vnoreného zoznamuli1>. Plytká kópia,li2>, je vytvorený pomocou copy.copy()> , zachovanie štruktúry najvyššej úrovne, ale zdieľanie odkazov na vnútorné zoznamy. hlboká kópia,li3>, je vytvorený pomocou copy.deepcopy()> výsledkom je úplne nezávislá kópiali1>vrátane všetkých vnorených prvkov. Kód vytlačí ID a hodnotyli2>ali3>, pričom sa zdôrazňuje rozdiel medzi plytkými a hlbokými kópiami z hľadiska referencie a nezávislosti.
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)> |
>
>
Výkon:
li2 ID: 2521878674624 Value: [1, 2, [3, 5], 4] li3 ID: 2521878676160 Value: [1, 2, [3, 5], 4]>
Čo je hlboké kopírovanie v Pythone?
Hlboká kópia vytvorí nový zložený objekt pred vložením kópií položiek nájdených v origináli do neho rekurzívnym spôsobom. Znamená to najprv vytvoriť nový objekt zbierky a potom ho rekurzívne naplniť kópiami podriadených objektov nájdených v origináli. V prípade hlbokého kopírovania sa kópia objektu skopíruje do iného objektu. Znamená to, že akékoľvek zmeny urobené na kópiu objektu neodrážajú v pôvodnom objekte.
Príklad:
Vo vyššie uvedenom príklade zmena vykonaná v zozname neovplyvnilo iné zoznamy, čo znamená, že zoznam je hlboko skopírovaný.
Tento kód ilustruje hlboké kopírovanie zoznamu s vnorenými prvkami pomocoucopy>modul. Spočiatku vytlačí pôvodné prvkyli1>, potom ich hlbokým skopírovaním vytvoríteli2>. Úprava prvku vli2>neovplyvňujeli1>, ako ukazujú samostatné výtlačky. To zdôrazňuje, ako hlboké kopírovanie vytvára nezávislú kópiu, ktorá zachováva pôvodný obsah zoznamu aj po zmenách kópie.
java elseif
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>=>' '>)> |
>
>
Výkon:
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>
Čo je plytká kópia v Pythone?
Plytká kópia vytvorí nový zložený objekt a potom v ňom odkazuje na objekty obsiahnuté v origináli, čo znamená, že vytvorí nový objekt kolekcie a potom ho vyplní odkazmi na podradené objekty nájdené v origináli. Proces kopírovania sa neopakuje, a preto nevytvorí kópie samotných podriadených objektov. V prípade plytkej kópie sa referencia objektu skopíruje do iného objektu. Znamená to, že akékoľvek zmeny vytvorené na kópiu objektu odrážať v pôvodnom objekte. V pythone je to implementované pomocou kopírovať () funkciu.
Príklad:
V tomto príklade zmena vykonaná v zozname ovplyvnilo iný zoznam, čo naznačuje, že zoznam je plytko skopírovaný. Dôležité body: Rozdiel medzi plytkým a hlbokým kopírovaním je relevantný len pre zložené objekty (objekty, ktoré obsahujú iné objekty, ako sú zoznamy alebo inštancie tried):
- Plytká kópia vytvorí nový zložený objekt a potom do neho (v rámci možností) vloží odkazy na objekty nájdené v origináli.
- Hlboká kópia vytvorí nový zložený objekt a potom doň rekurzívne vloží kópie objektov nájdených v origináli.
Príklad: Tento kód demonštruje plytké kopírovanie zoznamu s vnorenými prvkami pomocou ' copy'> modul. Spočiatku vytlačí pôvodné prvkyli1>, potom vykoná plytké kopírovanie doli2>. Úprava prvku vli2>ovplyvňuje príslušný prvok vli1,>pretože oba zoznamy zdieľajú odkazy na vnútorné zoznamy. To ukazuje, že plytké kopírovanie vytvára nový zoznam, ale neposkytuje úplnú nezávislosť pre vnorené prvky.
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>=>' '>)> |
zhlukovanie
>
>
Výkon:
The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4>
ODPORÚČANÉ ČLÁNKY – Rozdiel medzi plytkou a hlbokou kópiou triedy