如下所示,为什么最终的 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}]
它在附加操作之前按要求打印,但是在将字典附加到列表之后,为什么它会重复附加最后一个元素?
如下所示,为什么最终的 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}]
它在附加操作之前按要求打印,但是在将字典附加到列表之后,为什么它会重复附加最后一个元素?
当您第二次通过循环时,您正在为同一个键分配一个新值。
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}
如果您希望它有所不同,则每次循环都必须创建一个新字典。
你快到了。这只需要一个小修复:
l = [1, 2]
r = []
for el in l:
d = {}
d['k'] = el
print '> ' + str(d)
r.append(d)
print r
作为思考的食物,这里有一个更高级的方法来使用列表理解:
>>> [{'k': el} for el in [1, 2]]
[{'k': 1}, {'k': 2}]