在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。
1、淺拷貝:利用切片操作、工廠方法list方法拷貝
2、深拷貝:利用copy中的deepcopy方法進行拷貝
一、淺拷貝
如下,淺拷貝操作:
in [113]: a=['b通過切片操作拷貝achongyi
',['
zhang
',22]]
in [114]: b=a[:]
in [115]: c=list(a)c通過工廠方法拷貝a
in [116]: print由上,從a、b、c的id值來看,三者是不同的物件id(a),id(b),id(c)
50383040 49098264 50381384
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結果:只是想改b部分,卻都發生了改變a,b,c['
jiangxi
', ['
zhang
', 18]] ['
shandong
', ['
zhang
', 18]] ['
shanghai
', ['
zhang
', 18]]
3、操作1、操作2解析
針對第乙個元素,a、b、c索引不同,更改乙個後,其他的不會變,但是對於第二個元素列表['zhang', 22],a、b、c通過不同的索引指向了同乙個索引,所以b改完後,其他a、c也都會變。
二、深拷貝
使用copy中的deepcopy方法進行拷貝。
in [3]: a=['由此可見:通過deepcopy的物件引用,互相不影響。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]]
深拷貝就是在複製某些容器物件(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...