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 ]]
Další Kapitola: Funkce