Python3列表中填充了空字典

时间:2019-05-16 03:43:37

标签: python python-3.x

我找到了way来制作一个用相同文字填充的列表。

所以我做了以下事情:

my_list_of_dict = [{}] * 3

my_list_of_dict[0][0] = 1
my_list_of_dict[0][1] = 2

print(my_list_of_dict)
# What I thought : [{0: 1, 1: 2}, {}, {}]
# What actually happened : [{0: 1, 1: 2}, {0: 1, 1: 2}, {0: 1, 1: 2}]

这是一个错误吗?或预期功能?

似乎python并不是每次都初始化新字典,而只是将给定字典分配给列表。

加上,我该如何call(pronouce) [] * n?这是一种列表理解吗?

1 个答案:

答案 0 :(得分:5)

{}返回对该字典的引用,然后通过*3对同一个dict进行3个引用。 要解决此问题,请使用其他方法:

[{} for _ in range(3)]

使用zeros0)并不重要,因为它们是不可变的,因此,一旦您修改列表中的值,就可以“创建”新的数字,然后通过列表进行引用:

>>> l = [0]*3
>>> [id(x) for x in l]
[10910368, 10910368, 10910368]
>>> l[0] = 10
>>> [id(x) for x in l]
[10910688, 10910368, 10910368]

但是对于可变对象,您正在直接修改引用的对象,因此列表中的所有位置都知道该更改,因为它们指向同一对象:

>>> l = [[]]*3
>>> l
[[], [], []]
>>> l[0].append(10)
>>> l
[[10], [10], [10]]
>>> [id(x) for x in l]
[139858640463368, 139858640463368, 139858640463368]

通过使用其他理解,您将在理解的每个循环中创建一个 new 实例:

>>> l = [{} for _ in range(3)]
>>> l[0]["foo"] = 10
>>> l
[{'foo': 10}, {}, {}]