python 深淺拷貝

2022-06-28 12:57:10 字數 1852 閱讀 2072

淺拷貝

l1 = [1, '

a', [4, 5, 6]]

print(l1) #

[1, 'a', [4, 5, 6]]

print(id(l1)) #

163373256

print(id(l1[0])) #

1622830560

l2 = l1.copy() #

[1, 'a', [4, 5, 6]]

l2[2][0] = 4444

print(l2) #

[1, 'a', [4444, 5, 6]]

print(id(l2)) #

163375624

print(id(l2[0])) #

1622830560

print("

l1:", l1) #

l1: [1, 'a', [4444, 5, 6]]

print("

id_l1:

", id(l1)) #

id_l1: 163373256

原理: 手繪!

因為淺拷貝,只是建立了新的記憶體位址,簡單拷貝了原列表第一層所有元素指向的位址。 所以兩個列表內元素指向的是都是相同id。

其中第三個元素[4, 5, 6]是可變型別,指向乙個4,5,6三個元素集合的位址。若其中元素變化,不影響第三個元素[4, 5, 6]的id。l1和l2第三個元素依然指向相同的id。

所以當l1中列表元素發生變化,l2中列表同樣發生變化

深拷貝

import

copy

l1 = [1, '

a', [4, 5, 6]]

print(l1) #

[1, 'a', [4, 5, 6]]

print('

id(l1[0]):

',id(l1[0])) #

1622830560

print('

id(l1[2]):

',id(l1[2])) #

162961416

print(id(l1)) #

163373256

#print(id(l1[0]))

l2 = copy.deepcopy(l1) #

[1, 'a', [4, 5, 6]]

print('

id(l2[0]):

',id(l2[0])) #

1622830560 不可變型別ip位址相同

print('

id(l2[2]):

',id(l2[2])) #

163375432 可變型別ip位址發生變化

原理:經過測試,l1和l2的ip位址是相同的。但是其中不可變的列表元素ip位址是不同的。

深拷貝是把可變元素完全複製,而不可變元素指向位址保持一致。節約了空間,妙啊!

python 深淺拷貝案例 python 深淺拷貝

深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...

python 深淺拷貝

建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...

python深淺拷貝

python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....