python的拷貝方式以及深拷貝,淺拷貝詳解


python的拷貝方法有:切片方法, 工廠方法, 深拷貝方法, 淺拷貝方法等。

幾種方法都可以實現拷貝操作, 具體區別在於兩點:1.代碼寫法不同。 2.內存地址引用不同

代碼演示:

 1 import copy
 2 li = ['li', [100, 200, 300]]
 3 li_1 = li[:]       # 切片方法
 4 li_2 = list(li)    # 工廠方法
 5 li_3 = copy.copy(li)    # 淺拷貝
 6 li_4 = copy.deepcopy(li)  # 深拷貝
 7 print('li', li, 'id:', id(li))
 8 print('li1', li_1, 'id:', id(li_1))
 9 print('li2', li_2, 'id:', id(li_2))
10 print('li3', li_3, 'id:', id(li_3))
11 print('li4', li_4, 'id:', id(li_4))
12 
13 # 運行結果
14 # li ['li', [100, 200, 300]] id: 47813336
15 # li1 ['li', [100, 200, 300]] id: 47814096
16 # li2 ['li', [100, 200, 300]] id: 47513768
17 # li3 ['li', [100, 200, 300]] id: 47508656
18 # li4 ['li', [100, 200, 300]] id: 56333696
19 # 可以看到id都不一樣,說明他們指向的都不是同一個列表對象
20 # 將除深拷貝以外任意一個方法的‘100’,重新賦值為400, 再次運行結果為
21 li_2[1][0] = 400
22 print('li', li, 'id:', id(li))
23 print('li1', li_1, 'id:', id(li_1))
24 print('li2', li_2, 'id:', id(li_2))
25 print('li3', li_3, 'id:', id(li_3))
26 print('li4', li_4, 'id:', id(li_4))
27 # li ['li', [400, 200, 300]] id: 56332976
28 # li1 ['li', [400, 200, 300]] id: 56333736
29 # li2 ['li', [400, 200, 300]] id: 56033528
30 # li3 ['li', [400, 200, 300]] id: 56028416
31 # li4 ['li', [100, 200, 300]] id: 56333696
32 # 可以看到:只改變了一個列表而除deepcopy之外其他的列表對象都變成的‘400’
33 print('li', li, 'id:', id(li))
34 print('li1', li_1, 'id:', id(li_1))
35 print('li2', li_2, 'id:', id(li_2))
36 print('li3', li_3, 'id:', id(li_3))
37 print('li4', li_4, 'id:', id(li_4))

 

 

 

因為除deepcopy之外其它的拷貝方法都只是拷貝了列表中對象的引用,再開辟一塊新的內存來儲存,如果其中一個數據變了, 其他的也會跟着改變。

而deepcopy是拷貝的對象本身, 一旦拷貝過來, 則與之前的被拷貝者沒有任何關系(自己改變與原來的數組無關,原來的數組改變與自己無關)

 

 

蕭伯納說:“你有一個蘋果,我有一個蘋果,彼此交換一下,我們彼此仍然是各有一個蘋果;但是你有一種思,我有一種思想,彼此交換一下,才發現從不同角度看到的問題遠比本身更深刻,所以多交流多溝通是我們提高自我能力的一種方式!!!

如果你有更好更簡單的方法,請一定評論謝謝!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM