首页 > 解决方案 > 为什么?- 从循环构造字典列表不起作用,除非在每次迭代时重新创建字典

问题描述

我真的很难过,从循环创建字典列表不会产生预期的结果,除非在每次迭代时重新创建字典。

以下示例是人为设计的,仅用作最小的重复。

有两件事按预期工作:

l = list()
for i in range(1, 4):
    d = dict()  # dict recreated on every iteration
    d['index'] = i
    l.append(d)
print(l)

print([{'index': i} for i in range(1, 4)])

他们都打印:

[{'index': 1}, {'index': 2}, {'index': 3}]

没有按预期工作的事情:

d = dict()  # dict created once only
l = list()
for i in range(1, 4):
    d['index'] = i
    l.append(d)
print(l)

产生:

[{'index': 3}, {'index': 3}, {'index': 3}]

我本来希望index在每次传递时都会简单地覆盖所引用的现有字典的值,然后将其添加到列表中,并且我会得到一点性能改进(实际上字典要大得多)。

它几乎看起来好像l.append只是添加了引用而不是传递值。

我错过了一些令人尴尬的显而易见的事情吗?

标签: pythonloopsdictionarypass-by-reference

解决方案


“看起来好像l.append只是添加了引用而不是传递值。”:就是这样;你没有错过任何东西。


推荐阅读