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 seznamuli1>
. 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á kopieli1>
, včetně všech vnořených prvků. Kód vytiskne ID a hodnotyli2>
ali3>
, 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í prvkyli1>
, pak je hluboce zkopíruje a vytvoříli2>
. Úprava prvku vli2>
neovlivňujeli1>
, 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.
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ý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í prvkyli1>
, poté provede mělké kopírování doli2>
. Úprava prvku vli2>
ovlivňuje odpovídající prvek vli1,>
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> => )> |
>
>
pyspark
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