深淺拷貝 簡單案例說明(Python)

2021-10-03 07:43:58 字數 3125 閱讀 3418

在理解這塊內容之前需要明白python中的可變資料型別和不可變資料型別。

參考:我們通過例子來總結:

from copy import copy,deepcopy

a =3

c = copy(a)

b = deepcopy(a)

print(id

(c))

print(id

(b))

結果:

140723133869888

140723133869888

我們可以看到:我們先把copy中的copy和deepcopy匯入,然後a=3,之後分別用c和d來接收copy和deepcopy的返回值,列印其位址卻發現他們都指向了同一塊位址,並且這個位址是和a變數指向的位址是一樣的,該位址存放的是3。

好了,這時:我們做出一點點修改:令a = 4

a =

3c = copy(a)

b = deepcopy(a)

print(id

(a))

print(id

(c))

print(id

(b))

a =4

print(id

(a))

print(id

(c))

print(id

(b))

我們可以得到如下結果:

140722501906240

140722501906240

140722501906240

140722501906272

140722501906240

140722501906240

觀察:我們發現這時只有a變數的結果在修改後發生了改變,那麼究竟是為什麼?

原因:python中資料型別有不可變資料型別,整型就屬於不可變資料型別,當我們把a賦值為3時,令c和b得到其淺拷貝和深拷貝時,就相當於把c和b都指向了記憶體中存放3的位址。因為python自己不需要那麼多記憶體來存放冗餘的資料,我拷貝這些檔案時,無論是淺拷貝還是深拷貝,無論最終變數識別符號有多少,只需要讓他們都指向同乙個位址就可以。

重點:因為python在重新給存放不可變資料型別的變數重新賦值時,並不會把其指向位址的內容修改,而是重新「拿」乙個新的記憶體出來存放新的資料。

ls =[3

,2,1

]c = copy(ls)

b = deepcopy(ls)

print

(ls,

id(ls)

)print

(c,id

(c))

print

(b,id

(b))

ls[0]+=

1print

(ls,

id(ls)

)print

(c,id

(c))

print

(b,id

(b))

結果:

[3,

2,1]

2167612727816[3

,2,1

]2167612727880[3

,2,1

]2167633405576[4

,2,1

]2167612727816[3

,2,1

]2167612727880[3

,2,1

]2167633405576

結論1

淺拷貝和深拷貝在拷貝不可變資料型別時,變數都指向同乙個位址。

淺拷貝和深拷貝在拷貝可變資料型別時,變數都指向不同的位址。

在拷貝可變資料型別時,又建立了相同的新資料。

因為位址不同,所以修改ls中的資料時,深淺拷貝後得到的資料都不會改變。

據說二維的列表就會發生一些變化了。so:

code first:

ls =[3

,2,[

4,5]

]c = copy(ls)

b = deepcopy(ls)

print

(ls,

id(ls)

)print

(c,id

(c))

print

(b,id

(b))

ls[2][

0]=87

print

(ls,

id(ls)

)print

(c,id

(c))

print

(b,id

(b))

實驗:我們在ls中加了乙個列表,並嘗試兩次輸出,之間嘗試修改ls二位列表中的資料。這裡對ls[2][0]的資料進行了修改。

結果:

[3,

2,[4

,5]]

2654706295368[3

,2,[

4,5]

]2654727038984[3

,2,[

4,5]

]2654707561160[3

,2,[

87,5]

]2654706295368[3

,2,[

87,5]

]2654727038984[3

,2,[

4,5]

]2654707561160

現象:我們可以看到,修改ls[2][0]的值以後,深拷貝中的內容並沒有發生改變,而淺拷貝中的內容發生了變化。可我們觀察他們的位址並不一樣,為什麼呢?

解釋:淺拷貝在完成操作後,只對第一層進行拷貝(我們這裡把大於第一層的稱為深層),換句話說,淺拷貝完整的複製了ls[i](這裡表示第一層)即第一層的資料。這裡c得到的是第一層,第二層被第一層所指向。所以當我們修改深層資料時,淺拷貝的內容也會跟著發生變化。

深拷貝就u不一樣了,深拷貝會把所有可變資料型別都賦值一遍。(這裡好好理解什麼是可變資料型別)

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

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

簡單案例說明c 右值引用

理解此問題提前是理解臨時物件的概念,如果此概念模糊,請閱讀王健偉老師著作 c 新經典 14章13節,或者自己在網上查詢。右值引用,簡單說,就是為了解決物件複製的效能問題,實現物件內屬性的淺拷貝,注意,是物件內屬性,不是物件的淺拷貝。下面,我們直接看 理解。include include using ...

Linux 多執行緒拷貝檔案案例及其傳參說明

下面的簡單案例模擬了多執行緒拷貝乙個檔案 include include include include include include include include include define max path 255 define block size 4096 typedef struct...