六 python的深淺拷貝

2022-09-04 18:03:16 字數 1991 閱讀 6118

參考原文

(1)數字和字串的拷貝

a1 = 123123

a2 = 123123

輸出結果是:

1959780298352

1959780298352

import copy  # 使用淺拷貝需要匯入copy模組

a1 =

123123

a3 = copy.copy(a1)

# 使用copy模組裡的copy()函式就是淺拷貝了

print(id

(a1)

)print(id

(a3)

)>>

35233168

>>

35233168

import copy

a1 =

123123

a4 = copy.deepcopy(a1)

# 深拷貝是用copy模組裡的deepcopy()函式

print(id

(a1)

)print(id

(a4)

)>>

31432080

>>

31432080

檢視結果發現,對於深拷貝,數字和字串在記憶體當中用的也是同一塊位址。

# 淺拷貝

print()

print(id

(n1)

)print(id

(n3)

)print()

print(id

(n1[

"k3"])

)print(id

(n3[

"k3"])

)

通過以上結果可以看出,進行淺拷貝時,我們的字典第一層n1和n3指向的記憶體位址已經改變了,但是對於第二層裡的列表並沒有拷貝,它的記憶體位址還是一樣的。原理如下圖:

結論:所以對於淺拷貝,字典、列表、元組等型別,它們只拷貝第一層位址。

import copy

n1 =

n4 = copy.deepcopy(n1)

# 深拷貝

print()

print(id

(n1)

)print(id

(n4)

)print()

print(id

(n1[

"k3"])

)print(id

(n4[

"k3"])

)輸出結果:

31157560

35463600

35947144

35947336

通過以上結果發現,進行深拷貝時,字典裡面的第一層和裡面巢狀的位址都已經變了。對於深拷貝,它會拷貝多層,將第二層的列表也拷貝乙份,如果還有第三層巢狀,那麼第三層的也會拷貝,但是對於裡面的最小元素,比如數字和字串,這裡就是「wu」,123,「alex」,678之類的,按照python的機制,它們會共同指向同乙個位置,它的記憶體位址是不會變的。原理如下圖:

參考原文

Python基礎之六 深淺拷貝問題

1 l1 1 晴朗 2,小明 l2 l1 print l1 is l2 true l1 2 0 3 print l2 1,晴朗 3,小明 4 print l2 1,晴朗 3,小明 4 3 分析 1 建立了乙個名為l1的變數,這個變數指向乙個list物件 2 把l1的值賦值給l2,那麼l2變數將指向l...

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...