Včasih boste želeli celotno kopijo predmeta, drugič boste želeli, da uporablja reference. Oglejte si razlike v delovanju.
Python ponuja več učinkovitih pristopov za upravljanje podatkov. Razumevanje konceptov plitke in globoke kopije je ključnega pomena pri delu s podatkovnimi strukturami, kot so ugnezdeni seznami, slovarji ali predmeti po meri.
Tako plitva kot globoka kopija omogočata izdelavo replik podatkovnih struktur, vendar glede ugnezdenih podatkov delujeta drugače.
Uporaba plitke kopije
Plitvo kopiranje deluje tako, da ustvari kopijo strukture najvišje ravni izvirnega predmeta. To pomeni, da če izvirni objekt vsebuje ugnezdene objekte, se bo kopija sklicevala na iste ugnezdene objekte kot izvirnik. Z drugimi besedami, izdelava plitke kopije predmeta podvoji njegovo najbolj oddaljeno strukturo, ne morebitnih ugnezdenih predmetov, ki jih lahko vsebuje.
Če želite izvesti plitvo kopiranje v Pythonu, lahko uporabite modul za kopiranje kopirati() funkcijo ali .kopirati() metodo na objektu.
Razmislite o primeru delo s seznamom ali slovarjem 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}")
V zgornji kodi je glavni_seznam spremenljivka vsebuje seznam, ki vsebuje cela števila, in notranji seznam (ugnezdeni objekt), ki vsebuje črke. Funkcija kopiranja ustvari kopijo glavni_seznam ki jih koda shrani v drugo spremenljivko, plitka_kopija.
Vse spremembe, ki jih naredite v plitka_kopija ugnezdeni seznam bo neposredno vplival tudi na seznam glavni_seznam in obratno. Te spremembe kažejo, da je ugnezdeni ali notranji seznam plitka_kopija je samo sklicevanje na tisto glavni_seznam, zaradi česar bodo spremembe veljale v glavni_seznam preveč.
Medtem vse spremembe zunanjih elementov (cela števila) v obeh plitka_kopija oz glavni_seznam bo vplivalo samo na ta primer. Ti zunanji elementi so neodvisne vrednosti same po sebi, ne le zgolj reference.
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}")
Rezultat dokazuje, da sta oba zunanja elementa seznama neodvisna drug od drugega:
Enako velja za delo s slovarji.
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}")
Spremembe ugnezdenega slovarja dict1 vplivajo na oba dict1 in dict2. Hkrati se spreminjajo zunanji predmeti dict1 vplivajo samo na to.
Uporaba Deep Copy
Namesto sklicevanja na ugnezdene objekte izvirne kopije globoka kopija naredi popolnoma ločeno kopijo izvirnega predmeta in njegovih ugnezdenih objektov. Spreminjanje globoke kopije ne bo vplivalo na izvirni predmet in obratno; sta resnično ločeni vrednoti.
Če želite narediti globoko kopijo v Pythonu, uporabite deepcopy() funkcijo modula za kopiranje.
Razmislite o primeru dela s seznamom.
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}")
Tukaj koda izvede globoko kopijo glavni_seznam, ustvarjanje neodvisne kopije z imenom globoka_kopija.
Ko spremenite ugnezdeni seznam ali zunanje elemente v globoka_kopija, vaše spremembe ne vplivajo na prvotni seznam in obratno. To dokazuje, da ugnezdeni seznam ali zunanji elementi niso v skupni rabi med dvema kopijama.
Delo s predmeti po meri
Predmet po meri lahko ustvarite tako, da definiranje razreda Python in ustvarjanje primerka razreda.
Tukaj je primer ustvarjanja preprostega predmeta iz a Knjiga razred:
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}')"
Zdaj naredite tako plitvo kot globoko kopijo primerka tega Knjiga razred z uporabo kopirati 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)
Kot lahko vidite, je plitka kopija (knjiga2) je nov objekt, vendar se sklicuje na isti notranji objekt (seznam avtorjev) kot izvirni objekt (knjiga1). Zato sprememba avtorjev izvirnega predmeta vpliva na oba primerka (knjiga1 in knjiga2), medtem ko sprememba zunanje postavke (cena) vpliva samo na izvirni predmet (knjiga1).
Po drugi strani pa izdelava globoke kopije ustvari neodvisno kopijo izvirnega predmeta, vključno s kopijami vseh predmetov, ki jih vsebuje.
# 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 tem primeru globoka kopija (knjiga2) je popolnoma neodvisen objekt in spreminjanje izvirnega predmeta (knjiga1) ne vpliva na to.
Uporablja se za plitvo in globoko kopiranje
Pomembno je razumeti globoko in plitvo kopijo, da lahko izberete ustrezen pristop za obdelavo podatkov. Tukaj je nekaj scenarijev, kjer je vsaka metoda uporabna:
- Uporabite plitvo kopijo, če želite podvojiti zapleten objekt, ne da bi ustvarili nove primerke njegovih ugnezdenih objektov. Ta pristop je pomnilniško učinkovitejši in hitrejši kot globoko kopiranje, ker ne podvaja ugnezdenih objektov.
- Uporabite plitvo kopijo, da ustvarite posnetek stanja predmeta, medtem ko še vedno delite nekatere osnovne podatke med izvirnim in kopiranim objektom.
- Uporabite globoko kopijo, če želite spremeniti repliko predmeta, ne da bi to vplivalo na izvirnik. To generira neodvisne kopije ugnezdenih objektov, kar zagotavlja, da morebitne spremembe kopije ne veljajo za izvirnik.
- Globoka kopija je kritična, ko potrebujete neodvisne kopije ugnezdenih podatkovnih struktur, predvsem ko imate opravka z rekurzivnimi ali zapletenimi hierarhijami objektov.
Učinkovitost in premisleki
Ker plitka kopija ne ustvari novih primerkov ugnezdenih predmetov, običajno deluje hitreje in porabi manj pomnilnika kot globoka kopija. Vendar imata lahko izvirnik in plitka kopija neželene stranske učinke zaradi spreminjanja notranjih elementov v skupni rabi.
Zlasti za velike in globoko ugnezdene podatkovne strukture, globoko kopiranje, rekurzivni postopek, je lahko počasnejši in porabi več pomnilnika. Vendar pa zagotavlja popolno neodvisnost med izvirnikom in globokim dvojnikom, zaradi česar je manipulacija zapletenih podatkov varnejša.
Najboljša možnost kopiranja vaših podatkov
Mnogi programski jeziki uporabljajo koncept plitke in globoke kopije. Če ga razumete, lahko manipulirate s podatki brez nepredvidenih posledic.
Z uporabo tehnik plitvega in globokega kopiranja lahko izberete najboljši pristop za varno podvajanje podatkovnih struktur. Z razumevanjem učinkov na vaše podatke boste iz kode dobili bolj zanesljive in predvidljive rezultate.