Python3列表中填充了空dict

Python3列表中填充了空dict,python,python-3.x,Python,Python 3.x,我发现这个方法可以用相同的文字创建一个列表 所以我做了以下几点: 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}]

我发现这个方法可以用相同的文字创建一个列表

所以我做了以下几点:

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并不是每次都初始化新的dict,而是将给定的dict分配给列表


另外,我如何
调用(pronouce)[]*n
?这是一种列表理解吗?

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

[{} for _ in range(3)]
使用
0
0
)并不重要,因为它们是不可变的,因此一旦修改列表中的值,您将“创建”一个新数字,然后通过列表引用它:

>>> 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]
通过使用另一个理解,您正在理解的每个循环中创建一个新的实例:

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

知道了!非常感谢,我能知道怎么说吗?列表多重化?列表理解?列表结构?@Jerry,我不记得怎么称呼它了,对不起!