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