python之深淺拷貝

2021-08-21 00:17:04 字數 1859 閱讀 5992

基礎沒打牢,python的深淺copy老是混淆,模稜兩可的。。。

一、物件賦值:

a = [1,2,3]

b = a       # 物件賦值

print(id(a))

print(id(b))

執行上面的**,可以發現id(a)=id(b)

為什麼呢?其實是在記憶體中有乙個列表 [1,2,3],a和b就是兩個標籤,都指向列表 [1,2,3]如下圖:

當修改a為: 

a = [11,22,33]

然後print(a)

print(b)

結果為:

[11,22,33]

[1,2,3]

原因如下圖:

上面這行**的意思的把標籤 a 指向了記憶體中的另乙個物件[11,22,33]

二、copy()-------淺copy:

a = [1,2,3]

b = a.copy()

#如果是匯入copy模組的話要這麼用,如下

#from copy import copy

#b = copy(a)

print(id(a))

print(id(b))

此時id(a)是不等於id(b),所以當你修改a為:

a = [11,22,33]

然後print(a)

print(b)

結果為:

[11,22,33]

[1,2,3]

結論: 淺copy和物件賦值所看到的的效果是一樣的

但是,如果當a是這樣巢狀列表,程式如下:

a = [1,2,3,[4,5]]

b = a.copy()

print(id(a))

print(id(b))    同上,id(a)是不等於id(b)的,也就是a 和b是在記憶體中的兩個物件,只不過是有乙個公共的部分 [4,5], 

當修改這個公共部分的時候,列表a、b都會發生改變,例如:修改a[3][0]:    

a[3][0] =0

print(a)

print(b)

結果為:

[1,2,3,[0,5]]

[1,2,3,[0,5]]

這個地方很容易混淆的,為什麼改乙個,都改了呢?首先,兩個的id值是不同的,所以不可能是同一物件的原因。其實真正的原因就是所謂的淺拷貝,淺拷貝只是複製了第一層也就是[1,2,3,[***,***]],也就是最外面的列表,內層中巢狀的列表沒有複製,而內層的列表[4,5]還是a和b公共的部分,不信的可以執行下面**:

print(id(a[3]))

print(id(b[3]))   

三、deepcopy()------- 深copy

深copy就可以對應解決淺copy中巢狀的問題,**如下:

from copy import deepcopy

a = [1,2,3,[4,5]]

b = deepcopy(a)

print(id(a))

print(id(b))

同上,id(a)是不等於id(b)的

修改a[3][0]為:    

a[3][0] =0

print(a)

print(b)

結果為:

[1,2,3,[0,5]]

[1,2,3,[4,5]]

突然發現,雖然簡單的東西,這麼詳詳細細的寫下來,自己反倒是加深不少印象。。。

python之深淺拷貝

lis 1 3,world 1,hello lis 2 lis 1.copy print 列表1元素的id lis 1,id lis 1 0 id lis 1 0 0 id lis 1 0 1 id lis 1 1 id lis 1 2 print 列表2元素的id lis 2,id lis 2 0...

python之深淺拷貝

對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址。importcopy 數字 字串 n1 123 n1 age 10 print id n1 賦值 n2 n1 print id n2 淺拷貝 n2 copy.copy n1 print id n2 深拷貝 n3 ...

python之深淺拷貝

在python中的資料型別包括 bool,int,float,str,set,list,tuple,dict等。簡單資料型別 bool,int,float,str 複雜資料型別 list,tuple,set,dict 對於簡單的資料型別變數在記憶體中儲存都是儲存 資料本身 而對於複雜的資料型別來說,...