我用下面的代码创建了一个列表。
a = [[False] * 3] * 3
创建一个3 × 3矩阵,其中所有元素的False
值
用a[0][0] = True
将a[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)]
,与上面的唯一区别是False
s是独立创建的,但由于布尔值是不可变的,因此结果与上面的相同。