【发布时间】:2012-06-26 16:53:55
【问题描述】:
这两个列表的声明有什么区别?
>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]
>>> m = [[],[],[],[]]
>>> m[1].append(1)
>>> m
[[], [1], [], []]
【问题讨论】:
这两个列表的声明有什么区别?
>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]
>>> m = [[],[],[],[]]
>>> m[1].append(1)
>>> m
[[], [1], [], []]
【问题讨论】:
第一个创建了对单个列表的四个引用 --- 它是重复四次的同一个列表。第二个创建四个不同的列表。在第一种情况下,当您附加到一个列表时,它会影响所有这些,因为它们都是同一个对象。在第二种情况下,每个列表都是一个不同的对象,因此附加到一个对象不会影响其他对象。
【讨论】:
这会给你一个清晰的想法,在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
【讨论】:
也许这将有助于使其更明确?这相当于您的第一个示例:
>>> l1 = []
>>> l2 = [l1]*4
>>> l2
[[], [], [], []]
您在这里所做的基本上是创建一个包含 4 个项目的列表,所有这些项目都引用同一个列表。在我的代码中,该列表名为l1。
正如 Mark 在下面的评论中提到的,这也是这样的:
>>> l1 = []
>>> l2 = [l1, l1, l1, l1]
>>> l2
[[], [], [], []]
【讨论】:
l2 = [l1, l1, l1, l1]。
帮助我理解这种现象的是,您需要显式地构造您想要的每个列表。
您可以使用[] 显式构造一个空列表。在第一个示例中,您已经完成了一次,因此您有一个列表。在第二个中你已经完成了四次,所以有四个列表。
如果你不想多次写[]你可以这样做
[[] for _ in range(n)]
【讨论】:
[] 的数量