在Python中
li = [0] * 3
li[0] = 1
# li == [1, 0, 0]
这很好。
li = [set()] * 3
li[0].add(1)
# li == [{1}, {1}, {1}]
这将为列表中的所有人加1。 两者有什么区别?
答案 0 :(得分:3)
这里:
li = [0] * 3
li[0] = 1
您将创建一个包含三个元素的列表,所有元素都是不可变数0。然后将第一个元素替换为不可变数1。
这里:
li = [set()] * 3
li[0].add(1)
您创建一个集合(而不是三个集合),然后将其放入列表中三次。然后,您引用列表的第一个元素(当然是集合),并在其中添加一个数字。由于只创建了一个集合,因此这似乎会修改列表的每个元素(因为它们都是相同的)。
有关Python中[x] * n
的危险的更多信息,请参见:List of lists changes reflected across sublists unexpectedly
答案 1 :(得分:0)
Python中的对象通过引用存储和使用。当您写时:
li = [set()] * 3
您正在创建一个对象,然后复制其引用;而不是对象本身。