logo

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

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

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