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