Python深拷貝與淺拷貝引用
前言:
在Python中,對(duì)象賦值在本質(zhì)上是對(duì)對(duì)象的引用,當(dāng)創(chuàng)建一個(gè)對(duì)象把它賦值給另一個(gè)變量的時(shí)候,Python并沒(méi)有拷貝這個(gè)對(duì)象,而只是拷貝了這個(gè)對(duì)象的引用,這里通過(guò)程序,借用Python
中的copy模塊進(jìn)一步理解深拷貝、淺拷貝和對(duì)象賦值有什么不同。
這里分兩種情況:
(1)、存在父對(duì)象和子對(duì)象
演示代碼如下:
import copy ? #調(diào)用copy模塊 Dict = {'animal':'cat','num':[10,20,30],'color':'pink'} #創(chuàng)建新字典 Dict1_copy = Dict.copy() ?#淺拷貝 Dict1_dcopy = copy.deepcopy(Dict) ?#深拷貝 Dict2 = Dict ? #直接賦值對(duì)象為淺拷貝 Dict['num'][1] = 66 ? #修改創(chuàng)建字典的內(nèi)部值 print('Dict:'+str(Dict)) ?#輸出修改后的字典數(shù)據(jù) print('Dict1_copy:'+str(Dict1_copy)) ?#輸出淺拷貝數(shù)據(jù),數(shù)據(jù)被修改 print('Dict1_dcopy:'+str(Dict1_dcopy)) ?#輸出深拷貝的數(shù)據(jù),數(shù)據(jù)未被修改 print('Dict2:'+str(Dict2)) ?#對(duì)象賦值,數(shù)據(jù)被修改
運(yùn)行結(jié)果如下:
(2)、如果只存在父對(duì)象
演示代碼如下:
import copy ? #調(diào)用copy模塊 Dict = {'animal':'cat','num':'10','color':'pink'} #創(chuàng)建新字典 Dict1_copy = Dict.copy() ?#淺拷貝 Dict1_dcopy = copy.deepcopy(Dict) ?#深拷貝 Dict2 = Dict ? #淺拷貝,直接賦值對(duì)象 Dict['animal'] = 'dog' ? #修改創(chuàng)建字典的內(nèi)部值 print('Dict:'+str(Dict)) ?#輸出修改后的字典數(shù)據(jù) print('Dict1_copy:'+str(Dict1_copy)) ?#淺拷貝,但結(jié)果與深拷貝相同 print('Dict1_dcopy:'+str(Dict1_dcopy)) ?#輸出深拷貝的數(shù)據(jù),數(shù)據(jù)未被修改 print('Dict2:'+str(Dict2)) ?#對(duì)象賦值,數(shù)據(jù)被修改
運(yùn)行結(jié)果如下:
由此可以看出,數(shù)據(jù)修改后,深拷貝一定不會(huì)被修改;淺拷貝如果有所謂父對(duì)象和子對(duì)象即嵌套,第二層可以被修改,不同于深拷貝,如果不存在嵌套,只有父對(duì)象,雖然本質(zhì)上與深拷貝不同,但不會(huì)被修改;對(duì)象賦值,則是引用,跟著修改而改變。
下面舉個(gè)簡(jiǎn)單例子,改變特定的數(shù)值,對(duì)其它數(shù)值的影響:
Dict_A = { ? #建立新字典 ? ? "A":11, ? ? "B":22, ? ? "C":[33,44,55] } Dict_B = Dict_A ? ?#賦值操作 Dict_C = Dict_A.copy() ? #淺拷貝 Dict_D = copy.deepcopy(Dict_A) ? #深拷貝 print('Dict_A:'+str(Dict_A)) print('Dict_B:'+str(Dict_B)) print('Dict_C:'+str(Dict_C)) print('Dict_D:'+str(Dict_D))?
#修改Dict_D中A Dict_D['A'] = 99 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_B中A Dict_B['A'] = 77 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_C中A Dict_C['A'] = 88 print('Dict_A:'+str(Dict_A)) #不變 print('Dict_B:'+str(Dict_B)) #不變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_D中A Dict_D['A'] = 99 print('Dict_A:'+str(Dict_A)) #不變 print('Dict_B:'+str(Dict_B)) #不變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #變
#修改Dict_A中C的第二項(xiàng) Dict_C['C'][1] = 100 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_B中C的第二項(xiàng) Dict_C['C'][1] = 101 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_C中C的第二項(xiàng) Dict_C['C'][1] = 102 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_D中C的第二項(xiàng) Dict_D['C'][1] = 104 print('Dict_A:'+str(Dict_A)) #不變 print('Dict_B:'+str(Dict_B)) #不變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #變
到此這篇關(guān)于Python深拷貝與淺拷貝引用的文章就介紹到這了,更多相關(guān)Python拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python一行代碼實(shí)現(xiàn)快速排序的方法
排序算法是在高考或中考中出現(xiàn)頻率最多的點(diǎn),所以大家要掌握,今天小編給大家?guī)?lái)了通過(guò)Python一行代碼實(shí)現(xiàn)快速排序的方法,感興趣的朋友跟隨小編一起看看吧2019-04-04Python數(shù)據(jù)分析?Numpy?的使用方法
這篇文章主要介紹了Python數(shù)據(jù)分析?Numpy?的使用方法,Numpy?是一個(gè)Python擴(kuò)展庫(kù),專門做科學(xué)計(jì)算,也是大部分Python科學(xué)計(jì)算庫(kù)的基礎(chǔ),關(guān)于其的使用方法,需要的小伙伴可以參考下面文章內(nèi)容2022-05-05關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解
今天小編就為大家分享一篇關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python批量將csv文件編碼方式轉(zhuǎn)換為UTF-8的實(shí)戰(zhàn)記錄
近日在處理數(shù)據(jù)的時(shí)候發(fā)現(xiàn)有的文件為csv文件,Xiam 這篇文章主要給大家介紹了關(guān)于利用Python批量將csv文件編碼方式轉(zhuǎn)換為UTF-8的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07python爬蟲(chóng)之爬取百度音樂(lè)的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python爬蟲(chóng)之爬取百度音樂(lè)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08淺談Python中的可迭代對(duì)象、迭代器、For循環(huán)工作機(jī)制、生成器
這篇文章主要介紹了Python中的可迭代對(duì)象、迭代器、For循環(huán)工作機(jī)制、生成器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03