首页 > 代码库 > python中字典的陷阱

python中字典的陷阱

把字典与列表组合,如

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中字典的陷阱