python高階之深拷貝和淺拷貝

2021-09-22 18:49:24 字數 2030 閱讀 9743

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的記憶體位址不...