当创建列表时,似乎像[[False] * 3] * 3这样的形式只复制引用?



我用下面的代码创建了一个列表。

a = [[False] * 3] * 3

创建一个3 × 3矩阵,其中所有元素的False

a[0][0] = Truea[0][0]改为True,结果为:

[[True, False, False], [True, False, False], [True, False, False]]

,其中整个第一列变为True

但是,如果我使用for循环创建a,如:
a = [[False] * 3 for i in range(3)]

a = [[False for i in range(3)] for i in range(3)]

在执行相同的a[0][0] = True之后,我得到了我想要的结果:

[[True, False, False], [False, False, False], [False, False, False]]

,其中只有一个元素被改为True

为什么在Python中创建列表有这样的不同?谢谢你的回答!

  • [False] * 3给出了相同False的3个引用列表,但由于布尔值是不可变的,因此每个引用都是独立的。
  • [[False] * 3] * 3给了我们一个相同[False] * 3的3个引用的列表,因为list是可变的,这3个列表实际上是相同的。
  • a = [[False] * 3 for i in range(3)]等价于:
a = []
for i in range(3):
a.append([False] * 3)

这应该会告诉你为什么列表不同。

  • 对于[[False for i in range(3)] for i in range(3)],与上面的唯一区别是Falses是独立创建的,但由于布尔值是不可变的,因此结果与上面的相同。

最新更新