logo

kopírovať v Pythone (Deep Copy a Shallow Copy)

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.

Hlboká kópia v Pythone

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.

Plytká kópia v Pythone

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