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

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žitie copy> modul na vytváranie plytkých aj hlbokých kópií vnoreného zoznamu li1> . 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ópia li1> vrátane všetkých vnorených prvkov. Kód vytlačí ID a hodnoty li2> a li3> , 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 pomocou copy> modul. Spočiatku vytlačí pôvodné prvky li1> , potom ich hlbokým skopírovaním vytvoríte li2> . Úprava prvku v li2> neovplyvňuje li1> , 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.

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é prvky li1> , potom vykoná plytké kopírovanie do li2> . Úprava prvku v li2> ovplyvňuje príslušný prvok v li1,> 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> => ' '> )>

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