Ponekad ćete htjeti punu kopiju objekta, a drugi put ćete htjeti da koristi reference. Pogledajte razlike u djelovanju.

Python nudi nekoliko učinkovitih pristupa upravljanju podacima. Razumijevanje koncepata plitkog i dubokog kopiranja presudno je pri radu sa strukturama podataka poput ugniježđenih popisa, rječnika ili prilagođenih objekata.

I plitka i duboka kopija omogućuju vam izradu replika podatkovnih struktura, ali djeluju drugačije u pogledu ugniježđenih podataka.

Korištenje plitke kopije

Plitka kopija radi stvaranjem kopije strukture najviše razine izvornog objekta. To znači da, ako originalni objekt sadrži ugniježđene objekte, kopija će referencirati iste ugniježđene objekte kao i original. Drugim riječima, izrada plitke kopije objekta duplicira njegovu najudaljeniju strukturu, a ne ugniježđene objekte koje on može sadržavati.

Za izvođenje plitke kopije u Pythonu, možete koristiti modul za kopiranje kopirati() funkciju ili .kopirati() metoda na objektu.

Razmotrite primjer rad s popisom ili rječnikom u 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}")

U gornjem kodu, glavni_list varijabla sadrži popis koji sadrži cijele brojeve i unutarnji popis (ugniježđeni objekt) koji sadrži slova. Funkcija kopiranja stvara kopiju glavni_list koje kod pohranjuje u drugu varijablu, plitka_kopija.

Sve promjene koje napravite na plitka_kopija ugniježđeni popis također će izravno utjecati na popis glavni_list i obrnuto. Ove promjene pokazuju da je ugniježđeni ili unutarnji popis plitka_kopija je samo referenca na ono od glavni_list, čime se promjene primjenjuju u glavni_list isto.

U međuvremenu, sve promjene napravljene na vanjskim stavkama (cijelim brojevima) u bilo kojem plitka_kopija ili glavni_list će utjecati samo na tu instancu. Ove vanjske stavke su neovisne vrijednosti same po sebi, a ne samo puke 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}")

Izlaz pokazuje da su obje vanjske stavke popisa neovisne jedna o drugoj:

Ista ideja vrijedi i za rad s rječnicima.

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

Izvršene su promjene u ugniježđenom rječniku dict1 utjecati na oboje dict1 i izreka2. U isto vrijeme, promjene na vanjskim stavkama dict1 utjecati samo na njega.

Korištenje dubinske kopije

Umjesto pozivanja na ugniježđene objekte izvorne kopije, duboka kopija čini potpuno odvojenu kopiju izvornog objekta i njegovih ugniježđenih objekata. Izmjena duboke kopije neće utjecati na izvorni objekt i obrnuto; doista su odvojene vrijednosti.

Da biste napravili duboku kopiju u Pythonu, koristite duboka kopija () funkciju modula za kopiranje.

Razmotrite primjer rada s popisom.

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

Ovdje kod izvodi duboku kopiju glavni_list, stvarajući neovisnu kopiju pod nazivom duboka_kopija.

Kada izmijenite ugniježđeni popis ili vanjske stavke u duboka_kopija, vaše promjene ne utječu na izvorni popis, i obrnuto. Ovo pokazuje da se ugniježđeni popis ili vanjski elementi ne dijele između dvije kopije.

Rad s prilagođenim objektima

Možete izraditi prilagođeni objekt pomoću definiranje Python klase i stvaranje instance klase.

Evo primjera stvaranja jednostavnog objekta 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}')"

Sada napravite i plitku i duboku kopiju ovog primjerka Knjiga klasa pomoću 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)

Kao što vidite, plitka kopija (knjiga2) je novi objekt, ali referira na isti unutarnji objekt (popis autora) kao izvorni objekt (knjiga1). Dakle, promjena autora izvornog objekta utječe na obje instance (knjiga1 i knjiga2), dok promjena vanjske stavke (cijena) utječe samo na izvorni objekt (knjiga1).

S druge strane, izrada dubinske kopije stvara nezavisnu kopiju izvornog objekta, uključujući kopije svih objekata sadržanih u njemu.

# 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)

U ovom slučaju, duboka kopija (knjiga2) je potpuno neovisan objekt, a modificiranje izvornog objekta (knjiga1) ne utječe na to.

Koristi se za plitko kopiranje i duboko kopiranje

Od vitalne je važnosti razumjeti duboku i plitku kopiju kako biste mogli odabrati odgovarajući pristup za manipuliranje podacima. Evo nekoliko scenarija u kojima je svaka metoda primjenjiva:

  • Upotrijebite plitku kopiju ako želite replicirati složeni objekt bez generiranja novih instanci njegovih ugniježđenih objekata. Ovaj pristup je memorijski učinkovitiji i brži od dubokog kopiranja jer ne duplicira ugniježđene objekte.
  • Upotrijebite plitku kopiju da biste stvorili snimku stanja objekta dok još uvijek dijelite neke temeljne podatke između izvornog i kopiranog objekta.
  • Koristite duboku kopiju ako želite izmijeniti repliku objekta bez utjecaja na izvornik. Ovo generira neovisne kopije ugniježđenih objekata, osiguravajući da se sve promjene na kopiji ne odnose na izvornik.
  • Duboka kopija je kritična kada su vam potrebne neovisne kopije ugniježđenih struktura podataka, uglavnom kada se radi o rekurzivnim ili zamršenim hijerarhijama objekata.

Izvedba i razmatranja

Budući da plitka kopija ne generira nove instance ugniježđenih objekata, obično radi brže i koristi manje memorije od duboke kopije. Međutim, izvornik i plitka kopija mogu imati neželjene nuspojave zbog mijenjanja zajedničkih internih stavki.

Osobito za velike i duboko ugniježđene podatkovne strukture, duboka kopija, rekurzivni postupak, može biti sporiji i koristiti više memorije. Međutim, osigurava potpunu neovisnost između izvornika i dubokog duplikata, čineći zamršenu manipulaciju podacima sigurnijom.

Najbolja opcija kopiranja vaših podataka

Mnogi programski jezici koriste koncept plitke i duboke kopije. Razumijevanje toga omogućuje vam manipuliranje podacima bez nepredviđenih posljedica.

Koristeći tehnike plitkog i dubokog kopiranja, možete odabrati najbolji pristup za sigurno dupliciranje vaših podatkovnih struktura. Razumijevanjem učinaka na vaše podatke dobit ćete pouzdanije i predvidljivije rezultate iz svog koda.