深拷貝與淺拷貝

2022-02-07 10:44:06 字數 2969 閱讀 4632

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。

1、淺拷貝:利用切片操作、工廠方法list方法拷貝

2、深拷貝:利用copy中的deepcopy方法進行拷貝

一、淺拷貝

如下,淺拷貝操作:

in [113]: a=['

chongyi

',['

zhang

',22]]

in [114]: b=a[:]

b通過切片操作拷貝a

in [115]: c=list(a)
c通過工廠方法拷貝a

in [116]: print

id(a),id(b),id(c)

50383040 49098264 50381384

由上,從a、b、c的id值來看,三者是不同的物件

1、操作1:更改a、b、c第乙個元素

in [126]: a[0]="

jiangxi

"in [127]: b[0]="

shandong

"in [128]: c[0]="

shanghai

"in [132]: print

a,b,c['

jiangxi

', ['

zhang

', 22]] ['

shandong

', ['

zhang

', 22]] ['

shanghai

', ['

zhang

', 22]]

結果:各自更改成功,沒有異常。

2、操作2:更改b第二個元素裡面的第二個元素

in [137]: b[1][1]=18in [138]: print

a,b,c['

jiangxi

', ['

zhang

', 18]] ['

shandong

', ['

zhang

', 18]] ['

shanghai

', ['

zhang

', 18]]

結果:只是想改b部分,卻都發生了改變

3、操作1、操作2解析

針對第乙個元素,a、b、c索引不同,更改乙個後,其他的不會變,但是對於第二個元素列表['zhang', 22],a、b、c通過不同的索引指向了同乙個索引,所以b改完後,其他a、c也都會變。

二、深拷貝

使用copy中的deepcopy方法進行拷貝。

in [3]: a=['

jiangxi

',['

chongyi

',123]]

in [4]: import

copy

in [5]: b=copy.deepcopy(a)

in [6]: c=copy.deepcopy(a)

in [7]: b[0]="

shandong

"in [8]: c[0]="

shanghai

"in [9]: print

a,b,c['

jiangxi

', ['

chongyi

', 123]] ['

shandong

', ['

chongyi

', 123]] ['

shanghai

', ['

chongyi

', 123]]

in [10]: b[1][0]="

jinan

"in [11]: print

a,b,c['

jiangxi

', ['

chongyi

', 123]] ['

shandong

', ['

jinan

', 123]] ['

shanghai

', ['

chongyi

', 123]]

由此可見:通過deepcopy的物件引用,互相不影響。

深拷貝就是在複製某些容器物件(list)的時候,重新在記憶體裡分配乙個空間存放複製過來的索引(引用---二層索引),不是重新複製乙份底層的物件的內容在記憶體裡。

說白了,深拷貝,複製引用,且單獨為其開闢乙個記憶體空間存放。

ps:1、容器:可以存放其他型別的內容

2、列表(list):可以存放字串、數值、列表

三、深、淺拷貝總結

思路一:利用切片操作和工廠方法list方法拷貝是淺拷貝,只是拷貝了最外圍的物件本身,內部的元素都只是拷貝了乙個引用而已。

思路二:利用copy中的deepcopy方法進行拷貝是深拷貝,外圍和內部元素都進行了拷貝物件本身,而不是引用。

對於數字,字串和其他原子型別物件等,沒有被拷貝的說法(沒有層次),即便是用深拷貝,檢視id的話也是一樣的,如果對其重新賦值,也只是新建立乙個物件,替換掉舊的而已。

「淺拷貝」與「深拷貝」

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