Python列表嵌套语法

3
这两种声明列表的方式有什么区别?
>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]

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

可能是[Python 2D列表在尝试修改单个值时出现奇怪的行为]的重复问题(https://dev59.com/KnE85IYBdhLWcg3whD3j) - senderle
4个回答

12

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


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

3
也许这样能更明确一些?这与你的第一个例子相当:
>>> l1 = []
>>> l2 = [l1]*4
>>> l2
[[], [], [], []]

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

正如以下评论中Mark所提到的,这也完全像这样:

>>> l1 = []
>>> l2 = [l1, l1, l1, l1]
>>> l2
[[], [], [], []]

3
当向他人解释此内容时,我发现进一步解释第二行代码相当于简单地写成 l2 = [l1, l1, l1, l1] 会更有帮助。 - Mark Dickinson

1
帮助我理解这个现象的事情是,你需要明确地构建每一个你想要的列表。
你可以使用[]来显式地构造一个空列表。在第一个例子中,你只做了一次,所以有一个列表。在第二个例子中,你做了四次,所以有四个列表。
如果你不想多次写[],你可以这样做:
[[] for _ in range(n)]

好的观点。在原帖的例子中,创建的不同列表数量== [] 的数量。 - georg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接