Python列表语法列表

时间:2012-06-26 16:53:56

标签: python list syntax

列表列表的这两个声明之间有什么区别?

>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]

>>> m = [[],[],[],[]]
>>> m[1].append(1)
>>> m
[[], [1], [], []]

4 个答案:

答案 0 :(得分:12)

第一个创建对单个列表的四个引用 - 它是重复四次的相同列表。第二个创建四个不同的列表。在第一种情况下,当您附加到一个列表时,它会影响所有列表,因为它们都是相同的对象。在第二种情况下,每个列表都是一个不同的对象,因此附加到一个列表不会影响其他列表。

答案 1 :(得分:4)

这会给你一个明确的想法,在l中所有对象都具有相同的id()并且所有对象都是可变的,因此编辑其中任何一个都会自动编辑其他对象,因为它们都只是引用id=18671936m中的同一个对象都有不同的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)]