Понекад ћете желети пуну копију објекта, други пут ћете желети да користи референце. Погледајте разлике у акцији.
Питхон нуди неколико ефикасних приступа управљању подацима. Разумевање концепата плитких и дубоких копија је кључно када радите са структурама података као што су угнежђене листе, речници или прилагођени објекти.
И плитка и дубока копија вам омогућавају да правите реплике структура података, али се понашају другачије у односу на угнежђене податке.
Коришћење плитке копије
Плитка копија функционише тако што креира копију структуре највишег нивоа оригиналног објекта. То значи да, ако оригинални објекат садржи угнежђене објекте, копија ће референцирати исте угнежђене објекте као и оригинал. Другим речима, прављење плитке копије објекта дуплира његову најудаљенију структуру, а не угнежђене објекте које може да садржи.
Да бисте извршили плитку копију у Питхон-у, можете користити модул за копирање цопи() функцију или .цопи() метода на објекту.
Размотрите пример рад са листом или речником у Питхон-у.
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}")
У коду изнад, главна_лист променљива садржи листу која садржи целе бројеве и унутрашњу листу (угнежђени објекат) која садржи слова. Функција копирања креира копију главна_лист које код чува у другој променљивој, плитка_копија.
Све промене које унесете у плитка_копија угнежђена листа ће такође директно утицати на главна_лист и обрнуто. Ове промене показују да је угнежђена или унутрашња листа плитка_копија је само референца на то од главна_лист, чиме се промене примењују у главна_лист такође.
У међувремену, све промене направљене на спољним ставкама (целим бројевима) у оба плитка_копија или главна_лист ће утицати само на ту инстанцу. Ове спољашње ставке су независне вредности саме по себи, а не само пуке референце.
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}")
Резултат показује да су обе спољне ставке листе независне једна од друге:
Иста идеја важи и за рад са речницима.
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}")
Измене су направљене у угнежђеном речнику дицт1 утичу на обоје дицт1 и дицт2. Истовремено се мењају спољни предмети дицт1 утичу само на то.
Коришћење дубоког копирања
Уместо референцирања на угнежђене објекте оригиналне копије, дубока копија прави потпуно одвојену копију оригиналног објекта и његових угнежђених објеката. Измена дубоке копије неће утицати на оригинални објекат и обрнуто; оне су заиста засебне вредности.
Да бисте направили дубоку копију у Питхон-у, користите дубока копија() функција модула за копирање.
Размотрите пример рада са листом.
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}")
Овде код врши дубоку копију главна_лист, креирајући независну копију под називом дееп_цопи.
Када измените угнежђену листу или спољне ставке у дееп_цопи, ваше промене не утичу на оригиналну листу и обрнуто. Ово показује да се угнежђена листа или спољни елементи не деле између две копије.
Рад са прилагођеним објектима
Можете креирати прилагођени објекат помоћу дефинисање Питхон класе и креирање инстанце класе.
Ево примера креирања једноставног објекта од а Боок класа:
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}')"
Сада направите и плитку и дубоку копију инстанце овога Боок разред користећи копија модул.
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)
Као што видите, плитка копија (боок2) је нови објекат, али упућује на исти унутрашњи објекат (листу аутора) као оригинални објекат (боок1). Дакле, промена аутора оригиналног објекта утиче на обе инстанце (књига1 и књига2), док промена спољашње ставке (Цена) утиче само на оригинални објекат (боок1).
С друге стране, прављење дубоке копије ствара независну копију оригиналног објекта, укључујући копије свих објеката који се налазе у њему.
# 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)
У овом случају, дубока копија (боок2) је потпуно независан објекат и модификује оригинални објекат (боок1) не утиче на то.
Користи се за плитку и дубоку копију
Од виталног је значаја да разумете дубоку и плитку копију како бисте могли да изаберете одговарајући приступ за манипулисање подацима. Ево неколико сценарија у којима је сваки метод применљив:
- Користите плитку копију ако желите да реплицирате сложени објекат без генерисања нових инстанци његових угнежђених објеката. Овај приступ је ефикаснији у меморији и бржи од дубинског копирања јер не дуплира угнежђене објекте.
- Користите плитку копију да направите снимак стања објекта док још увек делите неке основне податке између оригиналних и копираних објеката.
- Користите дубоку копију ако желите да измените реплику објекта без утицаја на оригинал. Ово генерише независне копије угнежђених објеката, обезбеђујући да се све промене у копији не односе на оригинал.
- Дубока копија је критична када су вам потребне независне копије угнежђених структура података, углавном када се ради о рекурзивним или замршеним хијерархијама објеката.
Перформансе и разматрања
Пошто плитка копија не генерише нове инстанце угнежђених објеката, она обично ради брже и користи мање меморије од дубоке копије. Међутим, оригинал и плитка копија могу имати нежељене нуспојаве услед промене заједничких интерних ставки.
Посебно за велике и дубоко угнежђене структуре података, дубоку копију, рекурзивна процедура, може бити спорији и користити више меморије. Међутим, он обезбеђује потпуну независност између оригинала и дубоког дупликата, чинећи сложену манипулацију подацима безбеднијом.
Најбоља опција за копирање ваших података
Многи програмски језици користе концепт плитке и дубоке копије. Разумевање омогућава вам да манипулишете подацима без непредвиђених последица.
Коришћењем техника плитког и дубоког копирања, можете изабрати најбољи приступ за безбедно дуплирање ваших структура података. Разумевањем ефеката на ваше податке, добићете поузданије и предвидљивије резултате свог кода.