日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python深拷貝與淺拷貝引用_python

作者:技術人小柒 ? 更新時間: 2022-06-27 編程語言

前言:

在Python中,對象賦值在本質上是對對象的引用,當創建一個對象把它賦值給另一個變量的時候,Python并沒有拷貝這個對象,而只是拷貝了這個對象的引用,這里通過程序,借用Python中的copy模塊進一步理解深拷貝、淺拷貝和對象賦值有什么不同。

這里分兩種情況:

(1)、存在父對象和子對象

演示代碼如下:

import copy ? #調用copy模塊
Dict = {'animal':'cat','num':[10,20,30],'color':'pink'} #創建新字典
Dict1_copy = Dict.copy() ?#淺拷貝
Dict1_dcopy = copy.deepcopy(Dict) ?#深拷貝
Dict2 = Dict ? #直接賦值對象為淺拷貝
Dict['num'][1] = 66 ? #修改創建字典的內部值
print('Dict:'+str(Dict)) ?#輸出修改后的字典數據
print('Dict1_copy:'+str(Dict1_copy)) ?#輸出淺拷貝數據,數據被修改
print('Dict1_dcopy:'+str(Dict1_dcopy)) ?#輸出深拷貝的數據,數據未被修改
print('Dict2:'+str(Dict2)) ?#對象賦值,數據被修改

運行結果如下:

(2)、如果只存在父對象

演示代碼如下:

import copy ? #調用copy模塊
Dict = {'animal':'cat','num':'10','color':'pink'} #創建新字典
Dict1_copy = Dict.copy() ?#淺拷貝
Dict1_dcopy = copy.deepcopy(Dict) ?#深拷貝
Dict2 = Dict ? #淺拷貝,直接賦值對象
Dict['animal'] = 'dog' ? #修改創建字典的內部值
print('Dict:'+str(Dict)) ?#輸出修改后的字典數據
print('Dict1_copy:'+str(Dict1_copy)) ?#淺拷貝,但結果與深拷貝相同
print('Dict1_dcopy:'+str(Dict1_dcopy)) ?#輸出深拷貝的數據,數據未被修改
print('Dict2:'+str(Dict2)) ?#對象賦值,數據被修改

運行結果如下:

由此可以看出,數據修改后,深拷貝一定不會被修改;淺拷貝如果有所謂父對象和子對象即嵌套,第二層可以被修改,不同于深拷貝,如果不存在嵌套,只有父對象,雖然本質上與深拷貝不同,但不會被修改;對象賦值,則是引用,跟著修改而改變。
下面舉個簡單例子,改變特定的數值,對其它數值的影響:

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的第二項
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的第二項
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的第二項
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的第二項
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)) #變

原文鏈接:https://blog.csdn.net/m0_46983541/article/details/124458604

欄目分類
最近更新