python中字典的陷阱
阿新 • • 發佈:2017-07-18
列表組 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中字典的陷阱