V tomto článku sa pomocou príkladov dozviete o plytkej a hlbokej kópii v jazyku Python.
Skopírujte objekt v Pythone
V Pythone používame =
na vytvorenie kópie objektu operátor. Možno si myslíte, že sa tým vytvorí nový objekt; to nie. Vytvára iba novú premennú, ktorá zdieľa odkaz na pôvodný objekt.
Zoberme si príklad, keď vytvoríme zoznam s názvom old_list a pomocou =
operátora odovzdáme odkaz na objekt do new_list .
Príklad 1: Kopírovanie pomocou operátora =
old_list = ((1, 2, 3), (4, 5, 6), (7, 8, 'a')) new_list = old_list new_list(2)(2) = 9 print('Old List:', old_list) print('ID of Old List:', id(old_list)) print('New List:', new_list) print('ID of New List:', id(new_list))
Keď spustíme nad programom, výstup bude:
Starý zoznam: (((1, 2, 3), (4, 5, 6), (7, 8, 9)) ID starého zoznamu: 140673303268168 Nový zoznam: ((1, 2, 3), (4, 5 , 6), (7, 8, 9)) ID nového zoznamu: 140673303268168
Ako vidíte na výstupe, premenné old_list aj new_list zdieľajú rovnaké ID, tj 140673303268168
.
Ak teda chcete upraviť ľubovoľné hodnoty v zozname new_list alebo old_list, zmena je viditeľná v oboch.
V zásade niekedy možno budete chcieť mať pôvodné hodnoty nezmenené a upraviť iba nové hodnoty alebo naopak. V Pythone existujú dva spôsoby, ako vytvoriť kópie:
- Plytké kopírovanie
- Deep Copy
Aby tieto kópie fungovali, používame copy
modul.
Kopírovať modul
copy
Modul Python používame na plytké a hlboké operácie kopírovania. Predpokladajme, že musíte skopírovať zložený zoznam, napríklad x. Napríklad:
import copy copy.copy (x) copy.deepcopy (x)
Tu sa copy()
vráti plytká kópia x. Podobne deepcopy()
vráťte hlbokú kópiu x.
Plytké kopírovanie
Plytká kópia vytvorí nový objekt, ktorý uloží odkaz na pôvodné prvky.
Plytká kópia teda nevytvára kópiu vnorených objektov, iba kopíruje odkaz na vnorené objekty. To znamená, že proces kopírovania sa neopakuje ani sám nevytvára kópie vnorených objektov.
Príklad 2: Vytvorte kópiu pomocou plytkej kópie
import copy old_list = ((1, 2, 3), (4, 5, 6), (7, 8, 9)) new_list = copy.copy(old_list) print("Old list:", old_list) print("New list:", new_list)
Keď spustíme program, výstup bude:
Starý zoznam: ((1, 2, 3), (4, 5, 6), (7, 8, 9) Nový zoznam: ((1, 2, 3), (4, 5, 6), (7 , 8, 9))
Vo vyššie uvedenom programe sme vytvorili vnorený zoznam a potom ho plytko skopírovali pomocou copy()
metódy.
To znamená, že vytvorí nový a nezávislý objekt s rovnakým obsahom. Aby sme to overili, vytlačíme zoznam old_list aj new_list.
Aby sme potvrdili, že new_list sa líši od old_list, pokúsime sa pridať nový vnorený objekt do pôvodného a skontrolovať ho.
Príklad 3: Pridanie (4, 4, 4) do old_list pomocou plytkej kópie
import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.copy(old_list) old_list.append((4, 4, 4)) print("Old list:", old_list) print("New list:", new_list)
Keď spustíme program, vygeneruje sa:
Starý zoznam: ((1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)) Nový zoznam: ((1, 1, 1), (2 , 2, 2), (3, 3, 3))
Vo vyššie uvedenom programe sme vytvorili plytkú kópiu old_list. Nový zoznam obsahuje odkazy na pôvodné vnorené objekty uložené v zozname starý zoznam. Potom pridáme nový zoznam, tj. (4, 4, 4)
Do old_list. Tento nový podzoznam nebol skopírovaný do zoznamu new_list.
Keď však zmeníte akékoľvek vnorené objekty v zozname old_list, zmeny sa zobrazia v zozname new_list.
Príklad 4: Pridanie nového vnoreného objektu pomocou plytkej kópie
import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.copy(old_list) old_list(1)(1) = 'AA' print("Old list:", old_list) print("New list:", new_list)
Keď spustíme program, vygeneruje sa:
Starý zoznam: ((1, 1, 1), (2, „AA“, 2), (3, 3, 3)) Nový zoznam: ((1, 1, 1), (2, „AA“, 2 ), (3, 3, 3))
Vo vyššie uvedenom programe sme vykonali zmeny v old_list tj old_list(1)(1) = 'AA'
. Upravili sa podzoznamy old_list aj new_list v indexe (1)(1)
. Je to tak preto, lebo oba zoznamy zdieľajú referenciu rovnakých vnorených objektov.
Deep Copy
Hlboká kópia vytvorí nový objekt a rekurzívne pridá kópie vnorených objektov prítomných v pôvodných prvkoch.
Pokračujme príkladom 2. Avšak pomocou deepcopy()
funkcie prítomnej v copy
module vytvoríme hlbokú kópiu . Hlboká kópia vytvára nezávislú kópiu pôvodného objektu a všetkých jeho vnorených objektov.
Príklad 5: Kopírovanie zoznamu pomocou funkcie deepcopy ()
import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.deepcopy(old_list) print("Old list:", old_list) print("New list:", new_list)
Keď spustíme program, vygeneruje sa:
Starý zoznam: ((1, 1, 1), (2, 2, 2), (3, 3, 3) Nový zoznam: ((1, 1, 1), (2, 2, 2), (3 , 3, 3))
Vo vyššie uvedenom programe používame deepcopy()
funkciu na vytvorenie kópie, ktorá vyzerá podobne.
Ak však urobíte zmeny v ľubovoľných vnorených objektoch v pôvodnom objekte old_list, v kopírovaní new_list neuvidíte žiadne zmeny.
Príklad 6: Pridanie nového vnoreného objektu do zoznamu pomocou funkcie Deep copy
import copy old_list = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) new_list = copy.deepcopy(old_list) old_list(1)(0) = 'BB' print("Old list:", old_list) print("New list:", new_list)
Keď spustíme program, vygeneruje sa:
Starý zoznam: ((1, 1, 1), ('BB', 2, 2), (3, 3, 3)) Nový zoznam: ((1, 1, 1), (2, 2, 2), (3, 3, 3))
Keď vo vyššie uvedenom programe priradíme novú hodnotu k old_list, uvidíme, že je upravený iba old_list. To znamená, že starý aj nový zoznam sú nezávislé. Je to preto, že old_list bol rekurzívne skopírovaný, čo platí pre všetky jeho vnorené objekty.