列表列表的这两个声明之间有什么区别?
>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]
>>> m = [[],[],[],[]]
>>> m[1].append(1)
>>> m
[[], [1], [], []]
答案 0 :(得分:12)
第一个创建对单个列表的四个引用 - 它是重复四次的相同列表。第二个创建四个不同的列表。在第一种情况下,当您附加到一个列表时,它会影响所有列表,因为它们都是相同的对象。在第二种情况下,每个列表都是一个不同的对象,因此附加到一个列表不会影响其他列表。
答案 1 :(得分:4)
这会给你一个明确的想法,在l
中所有对象都具有相同的id()
并且所有对象都是可变的,因此编辑其中任何一个都会自动编辑其他对象,因为它们都只是引用id=18671936
和m
中的同一个对象都有不同的id()
,因此它们都是不同的对象。
>>> l = [[]]*4
>>> for x in l:
print(id(x))
18671936
18671936
18671936
18671936
>>> m=[[],[],[],[]]
>>> for x in m:
print(id(x))
10022256
18671256
18672496
18631696
答案 2 :(得分:3)
也许这有助于使其更明确?这相当于你的第一个例子:
>>> l1 = []
>>> l2 = [l1]*4
>>> l2
[[], [], [], []]
你基本上在做的是创建一个包含4个项目的列表,所有这些项目都引用相同的列表。在我的代码中,该列表名为l1
。
正如Mark在评论中提到的那样,这也是这样的:
>>> l1 = []
>>> l2 = [l1, l1, l1, l1]
>>> l2
[[], [], [], []]
答案 3 :(得分:1)
帮助我理解这种现象的是,您需要显式构建您想要的每个列表。
您可以使用[]
显式构建一个空列表。在第一个示例中,您已经完成了一次,因此您有一个列表。在第二次你已经完成了四次,所以有四个列表。
如果你不想多次写[]
,你可以做
[[] for _ in range(n)]