a =
18b =
18id
(a)# 結果為4321867632
id(b)
# 結果為4321867632
c =[1
,2,3
]d =[1
,2,3
]e = c
id(c)
# 結果為4372284616
id(d)
# 結果為4371531592
id(e)
# 結果為4372284616
- 這就是python裡面關於變數和引用的關係,如果我們通過列表方法修改e的值,c的值也會跟著改變:
4
)# c和e的結果都是[1, 2, 3, 4]
import copy
a1 =[1
,2,3
,4]a2 =[7
,8]b1 =
[a1, a2]
b2 = copy.copy(b1)
id(b1)
# 結果為:4372285576
id(b2)
# 結果為:4372403784
id(b1[0]
)# 結果為:4346655304
id(b2[0]
)# 結果為:43466553049)
# b1和b2都變成了:[[1, 2, 3, 4], [7, 8, 9]]
- 還有一種特殊情況,如果最外層是元組的話,那麼連最外層的引用都不會變:
c1 =
(a1, a2)
c2 = copy.copy(c1)
id(c1)
# 結果為:4370987208
id(c2)
# 結果為:4370987208
b3 = copy.deepcopy(b1)
id(b3)
# 結果為:4372404936
id(b3[0]
)# 結果為:4372424648, 同前面的都不一樣,上面的是4346655304
c3 = copy.deepcopy(c1)
id(c3)
# 結果為:4371158024,也就是說最外層是元組的話,最外層的引用照樣會被改變
- 那麼有特殊情況嗎?也有,就是內外全部都是不可變型別,比如內外都是元組型別的,那麼deepcopy也根本就不拷貝,也就是說由內而外的引用全部不變
d1 =(3
,4,5
)d2 =(6
,7,8
)e1 =
(d1, d2)
e2 = copy.deepcopy(e1)
id(e1)
# 結果為:4370982728
id(e2)
# 結果為:4370982728
id(e1[0]
)# 4372444720
id(e2[0]
)# 4372444720
b4 = b1[:]
# 此時b1和b4均為:[[1, 2, 3, 4], [7, 8, 9]]
id(b4)
# 4372425352, id(b1)在上面,是4372285576
id(b4[0]
)# 4346655304, id(b1[0])在上面,也是4346655304
item1 =
item2 = item1.copy()id
(item1)
# 4372443928
id(item2)
# 4372341456
id(item1[
"a"]
)# 4321867440
id(item2[
"a"]
)# 4321867440
python高階 深拷貝 淺拷貝
複製需要區分,複製的是原始檔的資料,還是指向原始檔資料的位址 1.引用 b a時,理解為b指向了a指向的資料,相當於引用複製 a 1,2 b a 驗證複製的是資料還是位址 1.檢視ab的位址 id a 2677646858824 2.淺拷貝 copy.copy import copy a 1,2 b...
前端的深拷貝和淺拷貝 前端面試 深拷貝和淺拷貝
面試題目 如何實現對乙個陣列或物件的淺拷貝和深拷貝?wtf,複製還分兩種,第一次遇到這種問題的時候很是無語呢,先來看看一般的答案的理解。淺拷貝是只拷貝一層,深層次的物件級別就只拷貝引用。深拷貝是拷貝多層,每一級別的資料都拷貝出來。也就是說,基本資料型別其實不存在深淺拷貝的問題,只有物件和陣列才存在深...
Python之深拷貝和淺拷貝
賦值,深拷貝和淺拷貝的區別?python中如何拷貝乙個物件?直接賦值 li1 li 只傳遞物件的引用,li1指向物件li的記憶體位址空間,因此,原有列表li改變,被賦值的li1也會做相應的改變.深拷貝 import copy,eg li3 copy.deepcopy li li和li3的記憶體位址不...