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.
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.
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