在python中初始化空字典列表

时间:2018-07-27 08:36:19

标签: python-3.x

我期望通过以下初始化方法产生相同的输出:

a = [{}, {}]
b = [{}] * 2
a[0]["assigned"] = 1
b[0]["assigned"] = 1
print(a)
print(b)

但输出如下:

[{'assigned': 1}, {}]
[{'assigned': 1}, {'assigned': 1}]

就像 b 一样,正在创建一个字典实例,并在所有列表元素中对其进行引用。

有人可以帮助我说明实现此问题的原因吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

乘以一个列表显然会复制对对象的引用。可以在这里看到:

>>> obj = object()
>>> id(obj)
140589987770544
>>> 
>>> objects = [obj] * 5
>>> print(*map(id, objects), sep="\n")
140589987770544
140589987770544
140589987770544
140589987770544
140589987770544

此问题的解决方法是在列表理解中创建一个新对象:

>>> objects = [object() for _ in range(5)]
>>> print(*map(id, objects), sep="\n")
140589987770576
140589987770528
140589987770560
140589987770592
140589987770608
相关问题