这是我觉得令人费解的片段。为什么
y[0][0] = 2
会初始化所有行中的所有列?
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = []
>>> x.append([0])
>>> x.append([0])
>>> x.append([0])
>>> x.append([0])
>>> x
[[0], [0], [0], [0]]
>>> y = [ [0] * 1 ] * 4
>>> y
[[0], [0], [0], [0]]
>>> x == y
True
>>> x[0][0] = 2
>>> y[0][0] = 2
>>> x
[[2], [0], [0], [0]]
>>> y
[[2], [2], [2], [2]]
>>>
在
y = [ [0] * 1 ] * 4
行中,Python 解释器实际上正在做的是创建一个包含 4 个指向同一对象的指针的列表。您实际上正在创建一个列表 [0]
以及对同一列表的 4 个引用。当你改变其中之一时,你就改变了所有。
这与您的初始化方式有关
y
:
y = [ [0] * 1 ] * 4
这基本上是说“创建一个包含单个元素的列表,
0
”。然后它说“将该列表四次放入新列表中”。因此,如果您更改原始列表,您就会更改您所做的所有后续副本(实际上是引用),因为它们都指向同一块内存。