Předchozí Kapitola: Sady a Zmrazené Sady
Další Kapitola: Funkce

Mělké a Hluboké Kopírování

Úvod


Jak jsme viděli v kapitole „Datové Typy a Proměnné“, Python má zvláštní chování – ve srovnání s jinými programovacími jazyky – při přiřazení a kopírování jednoduché datové typy jako celá čísla a řetězce. Rozdíl mezi mělkým a hlubokým kopírováním je relevantní pouze pro složené objekty, což jsou objekty obsahující jiné objekty, jako jsou seznamy nebo instance třídy.,
V následující fragment kódu y body na stejné místo v paměti, než X. Tyto změny, když jsme přiřadit různé hodnoty y. V tomto případě y obdrží zvláštní místo v paměti, jak jsme viděli v kapitole „Datové Typy a Proměnné“.

>>> x = 3>>> y = x

Ale i když to vnitřní chování zdá divné srovnání programovacích jazyků, jako je C, C++ a Perl, ale pozorovatelné výsledky úkolů odpověď naše očekávání. Ale to může být problematické, pokud budeme kopírovat proměnlivé objekty, jako jsou seznamy a slovníky.
Python vytváří skutečné kopie pouze v případě, že musí, tj., pokud to uživatel, programátor, výslovně požaduje.
seznámíme vás s nejdůležitějšími problémy, které mohou nastat při kopírování proměnlivých objektů, tj. při kopírování seznamů a slovníků.

Kopírování seznamu

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

V příkladu výše jednoduchý seznam je přiřazen k colours1. V dalším kroku přiřadíme colour1 barvám2. Poté je colours2 přiřazen nový seznam.
jak jsme očekávali, hodnoty barvy1 zůstaly nezměněny., Stejně jako v našem příkladuv kapitole „datové typy a proměnné“ bylo pro colours2 přiděleno nové umístění paměti, protože jsme této proměnné přiřadili úplný nový seznam.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

Ale otázka je, co se stane, pokud změníme prvek seznamu colours2 nebo colours1?
V příkladu výše přiřadíme novou hodnotu druhému prvku colours2. Spousta začátečníků bude překvapen, že seznam colours1 byl „automaticky“ změnil stejně.,
vysvětlení je, že k colours2 nedošlo k žádnému novému přiřazení, pouze k jednomu z jeho prvků.

Kopírovat s Plátkem Provozovatel

je možné zcela kopírovat mělké seznam struktur s plátkem provozovatele bez nutnosti jakýchkoli nežádoucích účinků, které jsme popsali výše:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

Ale jakmile seznam obsahuje sublists, máme stejné potíže, tedy jen ukazatele na thesublists.,

>>> lst1 = ]>>> lst2 = lst1

Toto chování je zobrazeno v následujícím diagramu:

Pokud se vám přiřadit novou hodnotu na 0. Prvek jednoho ze dvou seznamů, tam bude žádné vedlejší účinky. Problémy vznikají, pokud změníte jeden z prvků sublistu.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

následující diagram znázorňuje, co se stane, pokud jeden z prvků dílčí být změněn: Jak obsah lst1 a lst2, jsou změněny.,

Použití Metoda deepcopy z Modulu kopírovat

řešení popsaných problémů je použití modulu „kopírovat“. Tento modul poskytuje metodu „kopírovat“, který umožňuje úplnou kopii z libovolného seznamu, tj. mělké a další seznamy.
následující skript používá našem příkladu výše, a to metody:

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

Pokud bychom zachránit tento skript pod názvem deep_copy.py a když zavoláme skript s „python deep_copy.,py“, obdržíme následující výstup:

$ python deep_copy.py ]]

Předchozí Kapitola: Sady a Zmrazené Sady
Další Kapitola: Funkce

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *