Porozumění Shallow a Deep Copy v Pythonu

Porozumění Shallow a Deep Copy v Pythonu
Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Python nabízí několik účinných přístupů ke správě dat. Pochopení konceptů mělkého a hlubokého kopírování je zásadní při práci s datovými strukturami, jako jsou vnořené seznamy, slovníky nebo vlastní objekty.





MUO Video dne POKRAČOVÁNÍ V OBSAHU POKRAČUJTE PŘEJÍMÁNÍM

Mělké i hluboké kopírování vám umožní vytvářet repliky datových struktur, ale pokud jde o vnořená data, chovají se odlišně.





Použití mělké kopie

Mělká kopie funguje tak, že vytváří kopii struktury nejvyšší úrovně původního objektu. To znamená, že pokud původní objekt obsahuje vnořené objekty, bude kopie odkazovat na stejné vnořené objekty jako originál. Jinými slovy, vytvoření mělké kopie objektu duplikuje jeho nejvzdálenější strukturu, nikoli jakékoli vnořené objekty, které může obsahovat.





Chcete-li provést mělkou kopii v Pythonu, můžete použít modul kopírování kopírovat() funkce nebo .kopírovat() metoda na objektu.

Zvažte příklad práce se seznamem nebo slovníkem v Pythonu .



import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Ve výše uvedeném kódu je hlavní_seznam proměnná obsahuje seznam obsahující celá čísla a vnitřní seznam (vnořený objekt) obsahující písmena. Funkce kopírování vytvoří kopii souboru hlavní_seznam který kód ukládá do jiné proměnné, mělká_kopie .

Jakékoli změny, které provedete v mělká_kopie vnořený seznam také přímo ovlivní seznam hlavní_seznam a naopak. Tyto změny ukazují, že vnořený nebo vnitřní seznam mělká_kopie je pouze odkazem na to hlavní_seznam , čímž se změny použijí v hlavní_seznam také.





  změny vnořeného seznamu mělkých kopií

Mezitím jakékoli změny provedené na vnějších položkách (celých číslech) v obou mělká_kopie nebo hlavní_seznam ovlivní pouze tento případ. Tyto vnější položky jsou samy o sobě nezávislými hodnotami, nikoli pouhými odkazy.

import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Výstup ukazuje, že vnější položky obou seznamů jsou na sobě nezávislé:





jak zjistit informace o někom
  změny vnějších položek mělké kopie

Stejná myšlenka platí při práci se slovníky.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}} 
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Změny provedené ve vnořeném slovníku diktát1 ovlivnit obojí diktát1 a diktát2 . Současně se změní vnější položky diktát1 ovlivnit pouze to.

  pomocí mělké kopie s vnořeným slovníkem

Použití Deep Copy

Namísto odkazování na vnořené objekty původní kopie vytváří hluboká kopie zcela samostatnou kopii původního objektu a jeho vnořených objektů. Úprava hluboké kopie neovlivní původní objekt a naopak; jsou to skutečně samostatné hodnoty.

Chcete-li vytvořit hlubokou kopii v Pythonu, použijte deepcopy() funkce kopírovacího modulu.

Zvažte příklad práce se seznamem.

import copy 

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Zde kód provede hlubokou kopii hlavní_seznam , čímž se vytvoří nezávislá kopie s názvem deep_copy .

Když upravíte vnořený seznam nebo vnější položky v deep_copy , vaše změny neovlivní původní seznam a naopak. To ukazuje, že vnořený seznam nebo vnější prvky nejsou sdíleny mezi dvěma kopiemi.

  pomocí hlubokého kopírování s vnořeným seznamem

Práce s vlastními objekty

Můžete vytvořit vlastní objekt pomocí definování třídy Python a vytvoření instance třídy.

Zde je příklad vytvoření jednoduchého objektu z a Rezervovat třída:

Mohu vrátit peníze za hru ve službě Steam?
classBook: 
    def__init__(self, title, authors, price):
        self.title = title
        self.authors = authors
        self.price = price

    def__str__(self):
        returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Nyní vytvořte mělkou i hlubokou kopii této instance Rezervovat třídy pomocí kopírovat modul.

import copy 

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
             ["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Jak vidíte, mělká kopie ( kniha2 ) je nový objekt, ale odkazuje na stejný vnitřní objekt (seznam autorů) jako původní objekt ( kniha1 ). Změna autorů původního objektu tedy ovlivní obě instance (kniha1 a kniha2), zatímco změna vnější položky ( cena ) ovlivňuje pouze původní objekt ( kniha1 ).

  pomocí mělké kopie s vlastním objektem

Na druhou stranu vytvoření hluboké kopie vytvoří nezávislou kopii původního objektu, včetně kopií všech objektů v něm obsažených.

# Create a Book object 
book1 = Book("Why MakeUseOf Deep Copy?", \
             ["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

V tomto případě hluboká kopie ( kniha2 ) je zcela nezávislý objekt a modifikuje původní objekt ( kniha1 ) na to nemá vliv.

  pomocí hlubokého kopírování s vlastním objektem

Používá se pro mělké a hluboké kopírování

Je důležité porozumět hlubokému a mělkému kopírování, abyste si mohli vybrat vhodný přístup pro manipulaci s daty. Zde je několik scénářů, kde je každá metoda použitelná:

  • Pokud chcete replikovat složitý objekt bez generování nových instancí jeho vnořených objektů, použijte mělkou kopii. Tento přístup je efektivnější z hlediska paměti a rychlejší než hluboké kopírování, protože neduplikuje vnořené objekty.
  • Použijte mělkou kopii k vytvoření snímku stavu objektu a přitom stále sdílejte některá základní data mezi původními a zkopírovanými objekty.
  • Pokud chcete upravit repliku objektu bez dopadu na originál, použijte hlubokou kopii. To generuje nezávislé kopie vnořených objektů, což zajišťuje, že jakékoli změny kopie se nevztahují na originál.
  • Hluboká kopie je kritická, když potřebujete nezávislé kopie vnořených datových struktur, zejména při práci s rekurzivními nebo složitými hierarchiemi objektů.

Výkon a úvahy

Vzhledem k tomu, že mělká kopie negeneruje nové instance vnořených objektů, obvykle běží rychleji a využívá méně paměti než hluboká kopie. Originál a mělká kopie však mohou mít nežádoucí vedlejší účinky ze změny sdílených interních položek.

Zejména pro velké a hluboce vnořené datové struktury, hluboké kopírování, rekurzivní procedura , může být pomalejší a zabírat více paměti. Zajišťuje však úplnou nezávislost mezi originálem a hlubokým duplikátem, díky čemuž je manipulace se složitými daty bezpečnější.

Nejlepší možnost kopírování vašich dat

Mnoho programovacích jazyků používá koncept mělkého a hlubokého kopírování. Jeho pochopení vám umožní manipulovat s daty bez nepředvídaných následků.

Pomocí technik mělkého a hlubokého kopírování můžete vybrat nejlepší přístup k bezpečné duplikaci datových struktur. Pochopením účinků na vaše data získáte spolehlivější a předvídatelnější výsledky z vašeho kódu.