当dict在列表迭代中声明时,在dthon中的for-in迭代中将dict附加到列表中

时间:2012-04-24 03:53:22

标签: python

如下所示,为什么最后的r不打印[{'k': 1}, {'k': 2}]

l = [1, 2]
d = {}
r = []

for el in l:
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r  

输出:

> {'k': 1}
> {'k': 2}
[{'k': 2}, {'k': 2}]

它是在追加操作之前打印出来的,但是在将dict附加到列表之后,为什么它会重复追加最后一个元素?

2 个答案:

答案 0 :(得分:3)

当您第二次通过循环时,您正在为同一个键指定一个新值。

for el in l:
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r  

第一次循环,el1d['k']设置为1,然后打印。然后将d附加到r

第二次循环,el2d['k'] - 同一字典中同一个键的值非常相同 - 设置为2。然后,将同一个字典d附加到r

现在r和你说的一样

r = [d, d]

由于d['k']现在是2,因此列表d中对r的引用都会产生{'k': 2}

如果您希望它与众不同,则每次循环时都必须创建 new 字典。

答案 1 :(得分:0)

你快到了。这只需要一个小修复:

l = [1, 2]
r = []

for el in l:
    d = {}
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r 

作为思考的问题,使用list comprehension这是一种更高级的方法:

>>> [{'k': el} for el in [1, 2]]
[{'k': 1}, {'k': 2}]