li = [0] * 10和li = [set()] * 10有什么区别

时间:2018-08-22 10:31:51

标签: python-3.x

在Python中

li = [0] * 3
li[0] = 1
# li == [1, 0, 0]

这很好。

li = [set()] * 3
li[0].add(1)
# li == [{1}, {1}, {1}]

这将为列表中的所有人加1。 两者有什么区别?

2 个答案:

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

您正在创建一个对象,然后复制其引用;而不是对象本身。