淺拷貝:
對乙個物件進行淺拷貝其實是新建立乙個型別跟原物件一樣,其內容是原來物件的引用。有以下幾種方式實施(1)完全切片操作[:];(2)利用工廠函式,比如list(),dict()等;(3)使用copy模組的copy函式。
舉個例項:
# encoding=utf-8obj = ['name',['age',18]]
a=obj[:]
b=list(obj)
for x in obj,a,b:
print id(x)
a[0] = 'lisi'
b[0] = 'zhangsan'
print a
print b
a[1][1] = 25
print a
print b
35217032
35227912
29943304
['lisi', ['age', 18]]
['zhangsan', ['age', 18]]
['lisi', ['age', 25]]
['zhangsan', ['age', 25]]
細心的朋友應該看出來了,改變a[0]元素與b[0]元素都互不影響,為何改變a[1][1]的元素會影響b[1][1]的元素呢?
要解開這個問題,只有先了解深拷貝與淺拷貝。以上例項中,我們建立的a與b都是從obj物件的淺拷貝,obj中第乙個元素是字串屬於不可變型別,第二個元素是列表屬於可變型別。因此我們進行拷貝物件時,字串被顯示拷貝重新建立了乙個字串,而列表只是複製引用,所以改變列表的元素會影響所有引用物件。
深拷貝:
以上都是淺拷貝,那麼我們希望拷貝的物件是獨立的,修改時不要影響其它值,這種我們稱為深拷貝。實現深拷貝我們需要引用乙個copy模組,copy模組有兩個函式可用,乙個是copy淺拷貝;另乙個是deepcopy深拷貝。
# encoding=utf-8import copy
obj = ['name',['age',18]]
a=copy.deepcopy(obj)
b=copy.deepcopy(obj)
for x in a,b:
print id(x[0]),id(x[1])
a[1][1] = 25
b[1][1] = 30
print a
print b
33612664 35477256
33612664 35477640
['name', ['age', 25]]
['name', ['age', 30]]
使用深拷貝後,列表元素的id不一致,表示獨立物件,修改任何乙個列表元素的值都不會影響其它物件。
以下是幾點拷貝操作的注意事項:
第
一、非容器型別(比如數字、字串和其它「院子」型別的物件,像**、型別和range物件等)沒有被拷貝一說,淺拷貝是用完全切片操作來完成。
第二、如果元祖變數只包含原子型別物件,對它的深拷貝將不會進行。
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝與深拷貝
淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...