Pochopenie plytkého a hlbokého kopírovania v Pythone

Pochopenie plytkého a hlbokého kopírovania v Pythone
Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

Python ponúka niekoľko efektívnych prístupov k správe údajov. Pochopenie konceptov plytkého a hlbokého kopírovania je kľúčové pri práci s dátovými štruktúrami, ako sú vnorené zoznamy, slovníky alebo vlastné objekty.





MUO Video dňa POKRAČUJTE V OBSAHU POKRAČOVANÍM

Plytké aj hlboké kopírovanie vám umožňuje vytvárať repliky dátových štruktúr, ale pokiaľ ide o vnorené dáta, správajú sa odlišne.





Používanie plytkej kópie

Plytká kópia funguje tak, že vytvorí kópiu najvyššej úrovne štruktúry pôvodného objektu. To znamená, že ak pôvodný objekt obsahuje vnorené objekty, kópia bude odkazovať na rovnaké vnorené objekty ako originál. Inými slovami, vytvorenie plytkej kópie objektu duplikuje jeho vonkajšiu štruktúru, nie akékoľvek vnorené objekty, ktoré môže obsahovať.





Ak chcete vykonať plytkú kópiu v Pythone, môžete použiť modul kopírovania kopírovať () funkciu alebo .copy() metóda na objekte.

Zvážte príklad prácu so zoznamom alebo slovníkom v Pythone .



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}")

Vo vyššie uvedenom kóde je hlavný_zoznam premenná obsahuje zoznam obsahujúci celé čísla a vnútorný zoznam (vnorený objekt) obsahujúci písmená. Funkcia kopírovania vytvorí kópiu súboru hlavný_zoznam ktorý kód ukladá do inej premennej, plytká_kópia .

Akékoľvek zmeny, ktoré vykonáte na plytká_kópia vnorený zoznam tiež priamo ovplyvní zoznam hlavný_zoznam a naopak. Tieto zmeny ukazujú, že vnorený alebo vnútorný zoznam plytká_kópia je len odkazom na to hlavný_zoznam , čím sa zmeny použijú v hlavný_zoznam tiež.





  zmeny vnoreného zoznamu plytkej kópie

Medzitým, akékoľvek zmeny vykonané na vonkajších položkách (celé čísla) v oboch plytká_kópia alebo hlavný_zoznam ovplyvní iba tento prípad. Tieto vonkajšie položky sú samy osebe nezávislými hodnotami, nie sú to len 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 vonkajšie položky oboch zoznamov sú navzájom nezávislé:





  zmeny vonkajších častí plytkej kópie

Rovnaká myšlienka platí aj pri práci so slovníkmi.

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}")

Zmeny vykonané vo vnorenom slovníku diktát1 ovplyvniť oboje diktát1 a diktát2 . Zároveň sa zmení na vonkajšie položky diktát1 ovplyvniť len to.

  pomocou plytkej kópie s vnoreným slovníkom

Používanie funkcie Deep Copy

Namiesto odkazovania na vnorené objekty pôvodnej kópie vytvorí hĺbková kópia úplne samostatnú kópiu pôvodného objektu a jeho vnorených objektov. Úprava hĺbkovej kópie neovplyvní pôvodný objekt a naopak; sú to skutočne samostatné hodnoty.

Ak chcete vytvoriť hĺbkovú kópiu v Pythone, použite deepcopy() funkcia kopírovacieho modulu.

Zvážte príklad práce so zoznamom.

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}")

Tu kód vykoná hlbokú kópiu hlavný_zoznam , čím sa vytvorí nezávislá kópia s názvom deep_copy .

Keď upravíte vnorený zoznam alebo vonkajšie položky v deep_copy , vaše zmeny neovplyvnia pôvodný zoznam a naopak. To demonštruje, že vnorený zoznam alebo vonkajšie prvky nie sú zdieľané medzi dvoma kópiami.

  pomocou hlbokého kopírovania s vnoreným zoznamom

Práca s vlastnými objektmi

Môžete vytvoriť vlastný objekt pomocou definovanie triedy Python a vytvorenie inštancie triedy.

Tu je príklad vytvorenia jednoduchého objektu z a Kniha trieda:

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}')"

Teraz vytvorte plytkú aj hlbokú kópiu tejto inštancie Kniha triedy pomocou kopírovať modul.

iný počítač v tejto sieti má rovnakú IP adresu ako tento počítač
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)

Ako vidíte, plytká kópia ( kniha2 ) je nový objekt, ale odkazuje na rovnaký vnútorný objekt (zoznam autorov) ako pôvodný objekt ( kniha1 ). Zmena autorov pôvodného objektu teda ovplyvňuje obe inštancie (kniha1 a kniha2), zatiaľ čo zmena vonkajšej položky ( cena ) ovplyvňuje iba pôvodný objekt ( kniha1 ).

  pomocou plytkej kópie s vlastným objektom

Na druhej strane vytvorenie hlbokej kópie vytvorí nezávislú kópiu pôvodného objektu vrátane kópií všetkých objektov v ňom obsiahnutý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 prípade hlboká kópia ( kniha2 ) je úplne nezávislý objekt a modifikuje pôvodný objekt ( kniha1 ) to neovplyvní.

  pomocou hlbokého kopírovania s vlastným objektom

Používa sa na plytké kopírovanie a hlboké kopírovanie

Je dôležité pochopiť hlboké a plytké kopírovanie, aby ste si mohli zvoliť vhodný prístup na manipuláciu s údajmi. Tu je niekoľko scenárov, v ktorých je možné použiť každú metódu:

  • Ak chcete replikovať zložitý objekt bez generovania nových inštancií jeho vnorených objektov, použite plytkú kópiu. Tento prístup je pamäťovo efektívnejší a rýchlejší ako hlboké kopírovanie, pretože neduplikuje vnorené objekty.
  • Použite plytkú kópiu na vytvorenie snímky stavu objektu a zároveň zdieľanie niektorých základných údajov medzi pôvodnými a skopírovanými objektmi.
  • Ak chcete upraviť repliku objektu bez ovplyvnenia originálu, použite hĺbkovú kópiu. Takto sa vygenerujú nezávislé kópie vnorených objektov, čím sa zabezpečí, že akékoľvek zmeny kópie sa nebudú vzťahovať na originál.
  • Hlboká kópia je kritická, keď potrebujete nezávislé kópie vnorených dátových štruktúr, hlavne pri práci s rekurzívnymi alebo zložitými hierarchiami objektov.

Výkon a úvahy

Keďže plytké kopírovanie negeneruje nové inštancie vnorených objektov, zvyčajne beží rýchlejšie a využíva menej pamäte ako hlboké kopírovanie. Originál a plytká kópia však môžu mať nežiaduce vedľajšie účinky zo zmeny zdieľaných interných položiek.

Najmä pre veľké a hlboko vnorené dátové štruktúry, hlboké kopírovanie, rekurzívna procedúra , môže byť pomalší a zaberať viac pamäte. Zabezpečuje však úplnú nezávislosť medzi originálom a hlbokým duplikátom, vďaka čomu je manipulácia so zložitými údajmi bezpečnejšia.

Najlepšia možnosť kopírovania vašich údajov

Mnoho programovacích jazykov používa koncept plytkého a hlbokého kopírovania. Jeho pochopenie vám umožňuje manipulovať s údajmi bez nepredvídaných následkov.

Použitím techník plytkého a hlbokého kopírovania si môžete vybrať najlepší prístup na bezpečnú duplikáciu vašich dátových štruktúr. Pochopením účinkov na vaše údaje získate spoľahlivejšie a predvídateľnejšie výsledky z vášho kódu.