1. 程式人生 > >『python思考』關於列表的淺複製和深複製的理解

『python思考』關於列表的淺複製和深複製的理解

>>> mylist1 = [1, 2, 3, 4]
>>> myl = mylist1
>>> myl
[1, 2, 3, 4]
>>> mylist1[0] = 5
>>> mylist1
[5, 2, 3, 4]
>>> myl
[5, 2, 3, 4]

這個就是淺複製

淺複製僅僅只是複製了對物件的引用,即 mylist1 和 myl 指向的是同一個物件,所以如果改變了該物件的元素的話,則 mylist1 和 myl 所指向的物件都會改變,因為實際上就是同一個物件

>>> id(mylist1)
202009976
>>> id(myl)
202009976
可以看出兩者指向的物件在記憶體中的地址是相同的,即是同一個物件

>>> import copy
>>> mylist2 = [5, 6, 7, 8]
>>> myl2 = copy.deepcopy(mylist2)
>>> mylist2[0] = 9
>>> mylist2
[9, 6, 7, 8]
>>> myl2
[5, 6, 7, 8]
這個就是深複製
>>> id(mylist2)
200662512
>>> id(myl2)
202007336
而深複製後的兩個變數則指向的是兩個不同的物件,可以把這兩個物件理解為張得一模一樣的雙胞胎,雖然很像,但實際上是兩個不同的人,所以其中一個人發生了改變(如受傷了)也不會影響到另一個人

>>> id(mylist3[0])
30909144
>>> id(myl3[0])
30909144
>>> id(mylist3[3])
200634696
>>> id(myl3[3])
202008136
>>> mylist3 = [1, "a", 3, [4, 5, 6], [[7, 8, 9]]]
>>> myl3 = copy.deepcopy(mylist3)
>>> id(mylist3[1])
31110016
>>> id(myl3[1])
31110016
但是如果 mylist3 和 myl3 的元素指向的是同一個 『不可變』 的物件時,則 他們指向的仍然是同一個物件, 如 1 和 "a"