1. 程式人生 > >python中字典的陷阱

python中字典的陷阱

列表組 bsp 情況 重新定義 logs 元素 spa 想要 列表

把字典與列表組合,如

i=20
s=[]#定義一個空列表
b={d:i}#定義一個字典
while i>0:
     i=i-1
     b[d]=i#更新字典的值
     s.append(b)
print(s)

結果為

[{d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}, {d: 0}]
>>> s[0][d]=90 >>> s [{d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}, {d: 90}]

只改變第一個元素,也是這樣,

s的每個元素都是同一個字典實例,改變列表任何一個元素中字典的值,就全部改變了

若改為:

i=20
s
=[] while i>0: i=i-1 b={d:i}#每次重新定義b,並賦值 s.append(b) print(s)

結果為

[{d: 19}, {d: 18}, {d: 17}, {d: 16}, {d: 15}, {d: 14}, {d: 13}, {d: 12}, {d: 11}, {d: 10}, {d: 9}, {d: 8}, {d: 7}, {d: 6}, {d: 5}, {d: 4}, {d: 3}, {d: 2}, {d: 1}, {d: 0}]

則是我們想要的結果

第一種情況:是每個列表元素,其實是一個實例, 其實循環裏只是 在更新字典的值

第二種情況:每次重新定義字典

python中字典的陷阱