首页 > 解决方案 > python中空字典列表的初始化

问题描述

我期望以下初始化方式会产生相同的输出:

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

但输出如下:

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

看起来在b的情况下,正在所有列表元素中创建和引用单个字典实例。

有人可以帮我解释这个实现背后的原因吗?

谢谢。

标签: python-3.x

解决方案


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

>>> 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

推荐阅读