1. 程式人生 > >如何理解深淺拷貝和賦值的區別?

如何理解深淺拷貝和賦值的區別?

軟連接 都對 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)

技術分享圖片

由此可得出的結論是淺拷貝和原列表深層元素相當於賦值,最外層元素,相當於深拷貝,淺拷貝是賦值和深拷貝的中間產物


③.深拷貝和原列表的比較:

技術分享圖片

有上面的例子得出,深拷貝和淺拷貝是互不相關的,各自都對對方沒有影響!


如何理解深淺拷貝和賦值的區別?