『python思考』關於列表的淺複製和深複製的理解
阿新 • • 發佈:2019-02-11
>>> 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
而深複製後的兩個變數則指向的是兩個不同的物件,可以把這兩個物件理解為張得一模一樣的雙胞胎,雖然很像,但實際上是兩個不同的人,所以其中一個人發生了改變(如受傷了)也不會影響到另一個人但是如果 mylist3 和 myl3 的元素指向的是同一個 『不可變』 的物件時,則 他們指向的仍然是同一個物件, 如 1 和 "a">>> 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