淺拷貝與深拷貝

2022-08-13 13:48:11 字數 1554 閱讀 8149

淺拷貝

對乙個物件進行淺拷貝其實是新建立乙個型別跟原物件一樣,其內容是原來物件的引用。有以下幾種方式實施(1)完全切片操作[:];(2)利用工廠函式,比如list(),dict()等;(3)使用copy模組的copy函式。

舉個例項:

# encoding=utf-8

obj = ['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-8

import 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])

print

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...