如何理解深淺拷貝和賦值的區別?
阿新 • • 發佈:2018-08-09
軟連接 都對 brush 自己 lba 9.png 元素 遞增 app 拷貝分為:
賦值,淺拷貝,深拷貝,拷貝程度一次遞增
賦值:
賦值就是相當於做了個軟連接,所以不管你是修改了鏈接文聯的內容還是源文件的內容,這個文件都會有所改變(相當於鏡子裏的自己).
淺拷貝:
只是做了部分的拷貝,何謂部分拷貝?就是在賦值的基礎上減去了列表最外層的鏈接,其他的和賦值基本一樣,下面例子會有說明.
深拷貝:
相當於把文件復制了一份,新文件或老文件的改變都是互不相幹的,完全獨立於老文件.
1.先從id來分析:
import copy a = [1,2,3,[4,5,6,[7,8,9]]] b = a c = copy.copy(a) d = copy.deepcopy(a) print('查看每個變量的id') print(id(a)) print(id(b)) print(id(c)) print(id(d))
有上面的結果可以得出,賦值的id是和原來的id是一樣的,賦值只是把指針指向了列表a
深拷貝和淺拷貝的id是不一樣的,由此看出,深淺拷貝是分別獨立開辟出了一個內存空間了
2.在列表中增加元素來看看效果:
①賦值和原列表的比較
import copy a = [1,2,3,[4,5,6,[7,8,9]]] b = a c = copy.copy(a) d = copy.deepcopy(a) print('這個是最初的列表') a.append('aaa') a[3].append('aaa') a[3][3].append('aaa') print('原列表a',a) print('這個是賦值') b.append('bbb') b[3].append('bbb') b[3][3].append('bbb') print('原列表a',a) print('賦值列表b',b)
所以賦值列表,無論是原列表增加還是賦值列表增加都會增加
②.淺拷貝和原列表的比較:
import copy a = [1,2,3,[4,5,6,[7,8,9]]] b = a c = copy.copy(a) d = copy.deepcopy(a) print('這個是最初的列表') a.append('aaa') a[3].append('aaa') a[3][3].append('aaa') print('原列表a',a) print('這個是淺拷貝') c.append('ccc') c[3].append('ccc') c[3][3].append('ccc') print('原列表a',a) print('淺拷貝列表c',c)
由此可得出的結論是淺拷貝和原列表深層元素相當於賦值,最外層元素,相當於深拷貝,淺拷貝是賦值和深拷貝的中間產物
③.深拷貝和原列表的比較:
有上面的例子得出,深拷貝和淺拷貝是互不相關的,各自都對對方沒有影響!
如何理解深淺拷貝和賦值的區別?