python——copy模塊

包括深拷貝和淺拷貝操作的模塊。

首先要分清變量對象的概念,python中的變量類似指針,指向各個對象。比如a=2,是有一個名爲a的變量指向了2這個對象;x=[1,2,3]中變量x指向對象[1,2,3]。

然後,在python中,int、float、str、tuple和bool等都是不可變對象,list、set和dict是可變對象。可變對象可以原地修改,而不可變對象不能原地修改。

指向不可變對象的變量,若要修改,會指向內存處的新對象。可變對象是在原內存處修改,此時,若有不同變量指向同一可變對象,則這些變量都會被修改。

#下面使用str和list類型舉例:
a='abc'
b=a
a='xyz'
print(a,b)
#輸出:xyz abc 可見a,b指向了不同的對象
x=[1,2,3]
y=x
x[0]=10
print(x,y)
#輸出:[10, 2, 3] [10, 2, 3] 可見修改x[0]同時改變了y[0]

由此可見,使用 ’ = ‘ 複製變量對於不可變對象沒問題,但是對於可變對象確不行。

接下來引入深拷貝和淺拷貝概念:

深拷貝:將對象完全複製生成一個新的對象,是我們所理解的複製意義。

淺拷貝:類似於複製了一個指針,如果原變量改變,複製變量也被修改。

常用函數與示例

常用函數包括兩個,copy是淺拷貝方法,deepcopy是深拷貝方法,完全複製對象。

對於普通對象,copy和deepcopy沒有區別,但是對於嵌套的複雜結構,比如list內嵌套了list,兩者就存在差異。

import copy
x=[1,2,3]
y=copy.copy(x)
x[0]=10
print(x,y)
#輸出:[10, 2, 3] [1, 2, 3] 可以看到與上文中的區別,修改x不會影響y
#此處使用deepcopy也行
import copy
x=[1,[2,3,4],5]
y=copy.copy(x)
x[0]=10
x[1][1]=20
print(x,y)
#輸出:[10, [2, 20, 4], 5] [1, [2, 20, 4], 5]
#當list中嵌套list時,對於淺拷貝,修改x[0]不會產生影響,但是嵌套的list仍然會受到影響,y[1][1]也更改了
x=[1,[2,3,4],5]
y=copy.deepcopy(x)
x[0]=10
x[1][1]=20
print(x,y)
#輸出:[10, [2, 20, 4], 5] [1, [2, 3, 4], 5]
#使用深拷貝,y[1][1]仍然是原來的值。x和y指向兩個不同的對象。

總之,對於不可變對象可以直接使用’=‘複製變量;簡單可變對象,可以使用淺拷貝;對於可變對象且存在嵌套結構,則需要深拷貝,從而完全創建一個新對象。

另外,對於簡單可變對象,比如list的淺拷貝還有一種簡單方式,不必導入copy模塊,即切片

x=[1,2,3]
y=x[:]
x[0]=10
print(x,y)
#輸出:[10, 2, 3] [1, 2, 3]
#可見只需在x後加上[:],將x全部切出並創建了新的對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章