Python Dict/List字典數據特性:賦值變量採取地址(指針)傳遞,共享數值

Dict是一種特殊的數據類型,一個Dict變量的數值傳遞給其它變量時,並未複製內容交給其它變量,而是僅傳遞Dict變量的內存地址。所以當Dict變量值發生改變時,所賦值的變量內容隨之一起變化,如下代碼所示:

a_list = []

a = {1:'a',2:'b',3:'c'}
a_list.append(a)

a = {1:'x',2:'y',3:'z'}
a_list.append(a)

print(a_list)

#結果如下:
#  [{1: 'a', 2: 'b', 3: 'c'}, {1: 'x', 2: 'y', 3: 'z'}]
#

#採取單個元素獨立賦值,將觸發地址(指針)傳遞機制
a_list =[]
a[1] = 10
a[2] = 20
a[3] = 30
a_list.append(a)

a[1] = 11
a[2] = 12
a[3] = 13
a_list.append(a)

print(a_list)

#結果如下:
#  [{1: 11, 2: 12, 3: 13}, {1: 11, 2: 12, 3: 13}]
#
#  而不是所期望的:
#  [{1: 10, 2:20, 3: 30}, {1: 11, 2: 12, 3: 13}]
#

爲改變上述狀況,原dict值變化,不再影響已經賦值對象,採取淺層拷貝與深拷貝兩種策略:

淺層拷貝:temp = a.copy()

深層拷貝:temp = a.deepcopy()

同理:append的對象是list,也採取單獨賦值的機制,也將出現類似上述現象:

alist = []*3
alist[0] = 1
alist[1] = 2
alist[2] = 3

aalist = []
aalist.append(alist)
print(aalist)

#結果如下:alist = [1, 2, 3]
#

alist[0] = 11
alist[1] = 22
alist[2] = 33
aalist.append(alist)
print(aalist)

#結果如下:alist = [[11,22,33],[11,22,33]]
#而非所期待的:[[1,2,3], [11,22,33]]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章