在理解這塊內容之前需要明白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...