Python深拷貝與淺拷貝

淺拷貝就是對引用的拷貝,深拷貝就是對對象資源的拷貝。
1.賦值
1.賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址;
2.修改不可變對象(字符串、數組等)須要給出新的空間;
3.修改可變對象(列表、字典等)不須要給出新空間。數組

2.淺拷貝
淺拷貝(切片、工廠函數、對象的copy()方法、copy模塊中的copy函數)僅僅複製了存儲空間中內容的地址app

>>> a = ['huhu', [1, 2]]
>>> b = a[:]
>>> [id(x) for x in a]
[48401856, 48131728]
>>> [id(x) for x in b]
[48401856, 48131728]
>>> a[0] = 'haha'
>>> a[1].append(3)
>>> a
['haha', [1, 2, 3]]
>>> b
['huhu', [1, 2, 3]]

從上面的代碼能夠看出,a和b沒有修改前都是指向一個存儲空間的,即他們的內容和地址都是相同的。當a修改時,由於字符串是不可變對象,因此須要給出新的存儲空間來指定新的字符串,而列表就不用,因此b中字符串改變了,列表沒變。(至關於一臺電腦,a能夠用,而後b也想用,a就把能夠使用這臺電腦的權限賦予b,這樣ab公用這臺電腦)ide

3.深拷貝
深拷貝徹底拷貝了一個副本,存儲空間內容和地址都不同。
深拷貝只有一種方式:copy模塊中的deepcopy函數。函數

>>> from copy import deepcopy
>>> a = ['huhu', [1, 2]]
>>> b = deepcopy(a)
>>> [ id(x) for x in a]
[48401856, 48134104]
>>> [ id(x) for x in b]
[48401856, 48333048]
>>> a[0] = 'haha'
>>> a[1].append(3)
>>> a
['haha', [1, 2, 3]]
>>> b
['huhu', [1, 2]]

從這裏能夠看出深拷貝是徹底拷貝出來一個副本,從新給了一個存儲空間賦值給b,內容和地址與a不一樣。(至關於一臺電腦,a能夠用,而後b也想用,a就給b買了一臺如出一轍的電腦使用,這樣a用a的電腦,b用b的電腦)code

相關文章
相關標籤/搜索