Python擴充套件_淺拷貝和深拷貝

LibraSolo發表於2020-12-15
num1 = [1, 2, 3]
num2 = num1     # 將num1的地址值複製給了num2
num1.append(4)
num2.append(5)  # 無論num1或num2誰新增,都是一個內容(儲存的地址內容)改變
print(num1, id(num1))
print(num2, id(num2)) #id看地址相同

憨憨畫圖
num2 = num1
把num1堆記憶體的地址給了num2,num1和num2指定儲存地址內容是相同的,無論誰改變新的內容,都是在同一個堆記憶體改變新的值,所以改變內容相同,id相同。

輸出為:
[1, 2, 3, 4, 5] 1407260545856
[1, 2, 3, 4, 5] 1407260545856
# 淺copy  只copy列表的一級元素,複製了巢狀的可變資料型別的地址
num1 = [1, [2, 3]]
num2 = num1.copy()
print(num1, id(num1))
print(num2, id(num2))
num1.append(4)
num2.append(5)
num1[1].append(6)
print(num1, id(num1))
print(num2, id(num2))
print("num1[0]:", num1[0], id(num1[0]))
print("num2[0]:", num2[0], id(num2[0]))
print("num1[1]:", num1[1], id(num1[1]))
print("num2[1]:", num2[1], id(num2[1]))

憨憨圖片
num2 = num1.copy() 只能複製一級地址。num1和num2的堆地址不同,所以id不同,在一級地址內增加的內容,根據不同增加的內容,各自增加各自的。但是如果不是一級地址,比如增在[2,3],這不是一級地址了,他們的的堆地址是相同的,所以會一起改變,內容發生改變。

輸出為:
[1, [2, 3]] 2422347255616
[1, [2, 3]] 2422347256064
[1, [2, 3, 6], 4] 2422347255616
[1, [2, 3, 6], 5] 2422347256064
num1[0]: 1 140705941997216
num2[0]: 1 140705941997216
num1[1]: [2, 3, 6] 2422347256640
num2[1]: [2, 3, 6] 2422347256640
# 深拷貝 能夠copy列表所有層次的元素,複製了巢狀的可變資料型別元素
import copy
num1 = [1, [2, 3]]
num2 = copy.deepcopy(num1)
num1.append(4)
num2.append(5)
num1[1].append(6)
print(num1, id(num1))
print(num2, id(num2))
print("num1[0]:", num1[0], id(num1[0]))
print("num2[0]:", num2[0], id(num2[0]))
print("num1[1]:", num1[1], id(num1[1]))
print("num2[1]:", num2[1], id(num2[1]))

憨憨
num2 = num1.deepcopy 複製了所有層次的元素,除了最終得記憶體地址(元素的儲存地址)相同,其他的記憶體地址都不相同,所以各自更改,互不影響。

輸出為:
[1, [2, 3, 6], 4] 1657409099136
[1, [2, 3], 5] 1657409073984
num1[0]: 1 140705941997216
num2[0]: 1 140705941997216
num1[1]: [2, 3, 6] 1657409098880
num2[1]: [2, 3] 1657409099456

相關文章