kopírování v Pythonu (Deep Copy a Shallow Copy)

kopírování v Pythonu (Deep Copy a Shallow Copy)

v Krajta , Příkazy přiřazení nekopírují objekty, ale vytvářejí vazby mezi cílem a objektem. Když použijeme = Operátor vytvoří pouze novou proměnnou, která sdílí odkaz na původní objekt. Abychom vytvořili skutečné kopie nebo klony těchto objektů, můžeme použít kopírovací modul v Krajta .

Syntaxe Python Deepcopy

Syntax: copy.deepcopy(x)

Syntaxe Python Shallowcopy

Syntax: copy.copy(x)

Příklad:

K vytvoření těchto kopií používáme modul kopírování. Funkce copy() vrací mělkou kopii seznamu a deepcopy() vrací hlubokou kopii seznamu. Jak vidíte, oba mají stejnou hodnotu, ale mají různá ID.

Příklad: Tento kód ukazuje použití copy> k vytvoření mělkých i hlubokých kopií vnořeného seznamu li1> . mělká kopie, li2> , je vytvořen pomocí copy.copy()> , zachování struktury nejvyšší úrovně, ale sdílení odkazů na vnitřní seznamy. hluboká kopie, li3> , je vytvořen pomocí copy.deepcopy()> výsledkem je zcela nezávislá kopie li1> , včetně všech vnořených prvků. Kód vytiskne ID a hodnoty li2> a li3> , zdůrazňující rozdíl mezi mělkými a hlubokými kopiemi z hlediska odkazu 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ýstup:

  li2 ID:   2521878674624   Value:   [1, 2, [3, 5], 4]   li3 ID:   2521878676160   Value:   [1, 2, [3, 5], 4] 

Co je hluboké kopírování v Pythonu?

Hluboká kopie vytvoří nový složený objekt před vložením kopií položek nalezených v originálu do něj rekurzivním způsobem. Znamená to nejprve vytvořit nový objekt kolekce a poté jej rekurzivně naplnit kopiemi podřízených objektů nalezených v originálu. V případě hluboké kopie se kopie objektu zkopíruje do jiného objektu. Znamená to, že nějaké změny vytvořené na kopii objektu neodrážejí v původním objektu.

Hluboká kopie v Pythonu

Příklad:

Ve výše uvedeném příkladu změna provedená v seznamu neovlivnilo další seznamy, což znamená, že seznam je hluboce zkopírován.

Tento kód ilustruje hluboké kopírování seznamu s vnořenými prvky pomocí copy> modul. Zpočátku tiskne původní prvky li1> , pak je hluboce zkopíruje a vytvoří li2> . Úprava prvku v li2> neovlivňuje li1> , jak ukazují samostatné výtisky. To zdůrazňuje, jak hluboké kopírování vytváří nezávislou kopii, která zachovává původní obsah seznamu i po změnách v kopii.

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ýstup:

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 

Co je mělká kopie v Pythonu?

Mělká kopie vytvoří nový složený objekt a poté odkazuje na objekty obsažené v originálu v něm, což znamená, že vytvoří nový objekt kolekce a poté jej naplní odkazy na podřízené objekty nalezené v originálu. Proces kopírování se neopakuje, a proto nevytvoří kopie samotných podřízených objektů. V případě mělké kopie je odkaz na objekt zkopírován do jiného objektu. Znamená to, že nějaké změny vytvořené na kopii předmětu odrážet v původním objektu. V pythonu je to implementováno pomocí kopírovat() funkce.

Mělká kopie v Pythonu

Příklad:

V tomto příkladu změna provedená v seznamu ovlivnilo jiný seznam, což znamená, že seznam je zkopírován mělce. Důležité body: Rozdíl mezi mělkým a hlubokým kopírováním je relevantní pouze pro složené objekty (objekty, které obsahují jiné objekty, jako jsou seznamy nebo instance tříd):

  • Mělká kopie vytvoří nový složený objekt a pak do něj (v rámci možností) vloží odkazy na objekty nalezené v originálu.
  • Hluboká kopie vytvoří nový složený objekt a poté do něj rekurzivně vloží kopie objektů nalezených v originálu.

Příklad: Tento kód ukazuje mělké kopírování seznamu s vnořenými prvky pomocí ' copy'> modul. Zpočátku tiskne původní prvky li1> , poté provede mělké kopírování do li2> . Úprava prvku v li2> ovlivňuje odpovídající prvek v li1,> protože oba seznamy sdílejí odkazy na vnitřní seznamy. To ukazuje, že mělké kopírování vytváří nový seznam, ale neposkytuje úplnou nezávislost pro vnořené 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ýstup:

The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4 

DOPORUČENÉ ČLÁNKY Rozdíl mezi mělkou a hlubokou kopií třídy