Python賦值與深淺拷貝

2022-04-28 22:18:24 字數 1990 閱讀 5994

>> a = [1, 2, 3]

>>> b =a

>>> a = [4, 5, 6] //賦新的值給 a

>>>a

[4, 5, 6]

>>>b

[1, 2, 3]

#a 的值改變後,b 並沒有隨著 a 變

>>> a = [1, 2, 3]

>>> b =a

>>> a[0], a[1], a[2] = 4, 5, 6 //改變原來 list 中的元素

>>>a

[4, 5, 6]

>>>b

[4, 5, 6]

#a 的值改變後,b 隨著 a 變了

上面兩段**中,a 的值都發生了變化。區別在於,第一段**中是直接賦給了 a 新的值(從 [1, 2, 3] 變為 [4, 5, 6]);而第二段則是把 list 中每個元素分別改變。而對 b 的影響則是不同的,乙個沒有讓 b 的值發生改變,另乙個變了。怎麼用上邊的道理來解釋這個詭異的不同呢?

首次把 [1, 2, 3] 看成乙個物品。a = [1, 2, 3] 就相當於給這個物品上貼上 a 這個標籤。而 b = a 就是給這個物品又貼上了乙個 b 的標籤。 

第一種情況:

a = [4, 5, 6] 就相當於把 a 標籤從 [1 ,2, 3] 上撕下來,貼到了 [4, 5, 6] 上。在這個過程中,[1, 2, 3] 這個物品並沒有消失。 b 自始至終都好好的貼在 [1, 2, 3] 上,既然這個 reference 也沒有改變過。 b 的值自然不變。

第二種情況:

a[0], a[1], a[2] = 4, 5, 6 則是直接改變了 [1, 2, 3] 這個物品本身。把它內部的每一部分都重新改裝了一下。內部改裝完畢後,[1, 2, 3] 本身變成了 [4, 5, 6]。而在此過程當中,a 和 b 都沒有動,他們還貼在那個物品上。因此自然 a b 的值都變成了 [4, 5, 6]。

>>> import

copy

>>> origin = [1, 2, [3, 4]]

#origin 裡邊有三個元素:1, 2,[3, 4]

>>> cop1 =copy.copy(origin)

>>> cop2 =copy.deepcopy(origin)

>>> cop1 ==cop2

true

>>> cop1 is

cop2

false

#cop1 和 cop2 看上去相同,但已不再是同乙個object

>>> origin[2][0] = "

hey!

" >>>origin

[1, 2, ['

hey!

', 4]]

>>>cop1

[1, 2, ['

hey!

', 4]]

>>>cop2

[1, 2, [3, 4]]

#把origin內的子list [3, 4] 改掉了乙個元素,觀察 cop1 和 cop2

copy對於乙個複雜物件的子物件並不會完全複製,什麼是複雜物件的子物件呢?就比如序列裡的巢狀序列,字典裡的巢狀序列等都是複雜物件的子物件。對於子物件,python會把它當作乙個公共映象儲存起來,所有對他的複製都被當成乙個引用,所以說當其中乙個引用將映象改變了之後另乙個引用使用映象的時候映象已經被改變了。

所以說看這裡的origin[2],也就是 [3, 4] 這個 list。根據 shallow copy 的定義,在 cop1[2] 指向的是同乙個 list [3, 4]。那麼,如果這裡我們改變了這個 list,就會導致 origin 和 cop1 同時改變。這就是為什麼上邊 origin[2][0] = 「hey!」 之後,cop1 也隨之變成了 [1, 2, [『hey!』, 4]]。

deepcopy的時候會將複雜物件的每一層複製乙個單獨的個體出來。 

這時候的 origin[2] 和 cop2[2] 雖然值都等於 [3, 4],但已經不是同乙個 list了。即我們尋常意義上的複製。

參考

python賦值與深淺拷貝

參考文章 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 a 1 2,3 hello python c b a for i in range len a print id a i id b i all true print a b true這種情況下,b和a是一樣的,他們指向同...

賦值與深淺拷貝

a 1 b a a 2 print a a print b b 列印出結果 a 2 b 1 解析 當a 1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x5244...

python中的深淺拷貝與賦值。

賦值 賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。當使用可變資料結構時 如 list,dict,set 其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。a 1 2,3 b ab 1 4print id a a,id b b 1992269718152 1,...