如下所示,为什么最后的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附加到列表之后,为什么它会重复追加最后一个元素?
答案 0 :(得分:3)
当您第二次通过循环时,您正在为同一个键指定一个新值。
for el in l:
d['k'] = el
print '> ' + str(d)
r.append(d)
print r
第一次循环,el
为1
。 d['k']
设置为1
,然后打印。然后将d
附加到r
。
第二次循环,el
为2
。 d['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}]