理解一下python中的淺copy和深copy
阿新 • • 發佈:2017-06-29
學習 class 修改 資源 需要 code [0 str 變量
最近在學習過程中,了解了一下,淺copy和深copy,做個記錄。
所謂淺拷貝就是對引用的拷貝,所謂深拷貝就是對對象的資源的拷貝。
首先,對賦值操作我們要有以下認識:
- 賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址( 舊瓶裝舊酒 )。
- 修改不可變對象(
str
、tuple
)需要開辟新的空間 - 修改可變對象(
list
等)不需要開辟新的空間
- 淺拷貝僅僅復制了容器中元素的地址
>>> user = [‘tom‘, [‘age‘, 20]] >>> user_new = user.copy() >>> user_new [‘tom‘, [‘age‘, 20]] >>> user[0] = ‘jack‘ >>> user[1][1] = 19 >>> user [‘jack‘, [‘age‘, 19]] >>> user_new [‘tom‘, [‘age‘, 19]]
這裏可以看出,未修改前,user
和user_new中元素的地址都是相同的,不可變的 ‘tom‘ 和可變的list
地址都一樣。
說明淺拷貝知識將容器內的元素的地址復制了一份。這可以通過修改後,user_new
中字符串沒改變,但是list
元素隨著user
相應改變得到驗證。
淺拷貝是在另一塊地址中創建一個新的變量或容器,但是容器內的元素的地址均是源對象的元素的地址的拷貝。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )
- 深拷貝,完全拷貝了一個副本,容器內部元素地址都不一樣
>>> import copy >>> user = [‘tom‘, [‘age‘, 20]] >>> user_new = copy.deepcopy(user) >>> user_new [‘tom‘, [‘age‘, 20]] >>> user[0] = ‘jack‘ >>> user[1][1] = 19 >>> user [‘jack‘, [‘age‘, 19]] >>> user_new [‘tom‘, [‘age‘, 20]]
這裏可以看出,深拷貝後,user和user_new的地址以及user和user_new中的元素地址均不同,這是完全拷貝的一個副本。
修改user後,發現user_new沒有發生任何改變,因為user_new是一個完全的副本,元素地址與user均不同,user修改不影響user_new。
深拷貝是在另一塊地址中創建一個新的變量或容器,同時容器內的元素的地址也是新開辟的,僅僅是值相同而已,是完全的副本。也就是說( 新瓶裝新酒 )。
理解一下python中的淺copy和深copy