3

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

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

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

4 回答 4

12

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

于 2012-06-26T16:55:18.210 回答
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
于 2012-06-26T17:01:57.047 回答
3

也许这将有助于使其更加明确?这相当于您的第一个示例:

>>> l1 = []
>>> l2 = [l1]*4
>>> l2
[[], [], [], []]

你基本上在那里做的是创建一个包含 4 个项目的列表,所有这些项目都引用同一个列表。在我的代码中,该列表名为l1.

正如 Mark 在下面的评论中提到的,这也完全是这样的:

>>> l1 = []
>>> l2 = [l1, l1, l1, l1]
>>> l2
[[], [], [], []]
于 2012-06-26T16:57:00.427 回答
1

帮助我理解这种现象的事情是,您需要明确地构建您想要的每个列表。

您可以使用 显式构造一个空列表[]。在第一个示例中,您已经完成了一次,因此您有一个列表。在第二个中你已经完成了四次,所以有四个列表。

如果你不想写[]很多次你可以做

[[] for _ in range(n)]
于 2012-06-26T17:00:22.070 回答