深淺拷貝 一、淺拷貝 列表中存儲的是數據的記憶體地址,當我們要查詢或修改列表中的數據時,我們是通過列表中的地址找到要訪問的記憶體。當我們修改列表中的數據時,如果修改的是一個不可變類型(整型,長整型,浮點數,複數,布爾,字元串,元組),會開拓一個新的記憶體空間用於存放新的數據,然後把列表中的地址修改為存放新 ...
深淺拷貝
一、淺拷貝
列表中存儲的是數據的記憶體地址,當我們要查詢或修改列表中的數據時,我們是通過列表中的地址找到要訪問的記憶體。當我們修改列表中的數據時,如果修改的是一個不可變類型(整型,長整型,浮點數,複數,布爾,字元串,元組),會開拓一個新的記憶體空間用於存放新的數據,然後把列表中的地址修改為存放新數據的地址,此時沒有出現問題。但當列表中存的不是一個簡單的數據,而是一個可變類型(列表,字典),就會出現問題。下麵用一個例子來解釋:
print('修改前')
a = [[1,2],3,4]
b = a.copy()
print('a的值為',a)
print('b的值為',b)
print('修改後')
b[0][1]=3
print('a的值為',a)
print('b的值為',b)
輸出如下
結果發現修改了b中的值之後a中的值也跟著改變了。
這是因為a中存的是列表[1,2]地址,a和b中的列表[1,2]地址是相同的,我修改b中的數據改變的是列表[1,2]記憶體地址所指向的數據,而沒有修改列表[1,2]本身的地址,b還在指向列表[1,2],所以a和b會相互影響。
用一張圖來簡單解釋:
為瞭解決這樣的問題,可以使用
二、深拷貝
深拷貝可以重新開闢記憶體空間,將內容複製的更徹底,a和b之間相互沒有影響。
import copy print('修改前') a = [[1,2],3,4] b = copy.deepcopy(a) print('a的值為',a) print('b的值為',b) print('修改後') b[0][1]=3 print('a的值為',a) print('b的值為',b)
結果
這樣的話a和b之間就不會互相影響了。
以上為個人理解,有誤的話還請路過的大佬指正一下。