Python 3.x淺拷貝和深拷貝

淺拷貝和深拷貝

變量標籤,一個變量可以有一個標籤,也可以有多個標籤;一個標籤可以指向一個數據,也可以指向另一個數據。

所謂深拷貝就是對對象的資源的拷貝
所謂淺拷貝就是對引用的拷貝

Python默認複製對象是淺拷貝,是兩個標籤指向同一份數據,通過任何一個標籤修改數據,都會改變。但如果指向改變其中一個標籤的數據,另一個不希望被改變,該怎麼做呢?

–淺拷貝


import copy
a=[1,2,3,['a','b','c']]
b=a
c=copy.copy(a)
id(a)
id(b)
id(c)  c是獨立的新開闢的地址空間,與a無關係
a.append('d')
b
c		此時修改a對象,c已經不會受影響

下面我們嘗試改變深層的子對象,但需要注意一點,修改的子對象必須是可變類型,比如數字,字符串,元組屬於不可數據類型。
id(a[3]).append(‘d’)
c[3] 也發生改變了
c
淺拷貝,更深層特點,父對象裏面的子對象地址空間竟然是相同的。無論是可變類型子對象,還是不可變類型子對象地址都是相同的,當然指的是copy()操作時已有的對象,如果拷貝後添加新對象,則不受影響。

id(a[0])
id(c[0])
id(a[3])
id(c[3])	

–深拷貝

d=copy.deepcopy(a)
d
a.append('d')
d		使用深拷貝,相當於兩個完全獨立對象

id(d)
id(a)
對子對象的更改
a[3].append('a3')
d[3].append('d3')
a
d

id(a[3])
id(d[3]) 	//對於可變數據類型的對象,地址已經發生徹底改變
id(a[0])
id(d[0])	//對於不可變數據類型的對象,地址未改變,看似依然像淺拷貝

總結:淺拷貝把父對象拷貝出來,但使用的數據同一地址空間,深拷貝是完全把對象獨立出來。但深拷貝淺拷貝,對於不可變數據類型的對象,都只用同一份,一旦使用索引index修改不可變數據類型對象,實際就開闢了新地址空間,貼變量標籤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章