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]]