標籤:技術分享 span 恢複 .com back 淺拷貝 深拷貝 style png
---恢複內容開始---
數字和字串
數字和字串中的記憶體都指向同一個地址,所以深拷貝和淺拷貝對於他們而言都是無意義的
import copya = 123 #賦值print(id(a)) #輸出儲存變數的地址b = aprint(id(b))b = copy.copy(a) #淺拷貝print(id(b))c = copy.deepcopy(a) #深拷貝print(id(c))
淺拷貝
對於字典 元組 和列表來說,進行淺拷貝和深拷貝時,記憶體的地址是不同的
淺拷貝只會拷貝記憶體中的第一層資料
import copydic = {‘key1‘:123,‘key2‘:[123,456]} #建立一個字典嵌套列表print(id(dic[‘key1‘]))print(id(dic[‘key2‘]))print(id(dic[‘key2‘][0])) #列印列表中的地址print("\n")new_dic = copy.copy(dic) #使用淺拷貝賦值 print("*",id(new_dic[‘key1‘]))print("*",id(new_dic[‘key2‘]))print("*",id(new_dic[‘key2‘][0]))
發現記憶體中地址的值都是完全相同
深拷貝
而對於深拷貝來說將會把所有資料重新建立
import copydic = {‘key1‘:123,‘key2‘:[123,456]} #建立一個字典嵌套列表print(id(dic[‘key1‘]))print(id(dic[‘key2‘]))print(id(dic[‘key2‘][0])) #列印列表中的地址print("\n")new_dic = copy.deepcopy(dic) #使用深拷貝賦值 print("*",id(new_dic[‘key1‘]))print("*",id(new_dic[‘key2‘]))print("*",id(new_dic[‘key2‘][0]))
深淺拷貝的應用
在淺拷貝中 當改變拷貝對象的值 被拷貝對象的值也會隨之改變
import copydic = {‘key1‘:123,‘key2‘:[123,456]} #建立一個字典嵌套列表print(dic[‘key2‘][0]) #列印列表中的地址print("\n")new_dic = copy.deepcopy(dic) #使用淺拷貝賦值 new_dic[‘key2‘][0] = 789 #改變字典中列表的值print(dic[‘key2‘][0])print((new_dic[‘key2‘][0]))
當不想改變被拷貝的值時 應該使用深拷貝
import copydic = {‘key1‘:123,‘key2‘:[123,456]} #建立一個字典嵌套列表print(dic[‘key2‘][0]) #列印列表中的地址print("\n")new_dic = copy.deepcopy(dic) #使用深拷貝賦值 new_dic[‘key2‘][0] = 789 #改變字典中列表的值print(dic[‘key2‘][0])print((new_dic[‘key2‘][0]))
淺拷深拷貝深拷貝貝淺拷貝
---恢複內容結束---
python的深拷貝和淺拷貝