python-3.x - python中空字典列表的初始化
问题描述
我期望以下初始化方式会产生相同的输出:
a = [{}, {}]
b = [{}] * 2
a[0]["assigned"] = 1
b[0]["assigned"] = 1
print(a)
print(b)
但输出如下:
[{'assigned': 1}, {}]
[{'assigned': 1}, {'assigned': 1}]
看起来在b的情况下,正在所有列表元素中创建和引用单个字典实例。
有人可以帮我解释这个实现背后的原因吗?
谢谢。
解决方案
将列表相乘显然会复制对对象的引用。可以在这里看到:
>>> 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