二维数组初始化的差异[重复]
Posted
技术标签:
【中文标题】二维数组初始化的差异[重复]【英文标题】:Difference in 2D array initialization [duplicate] 【发布时间】:2021-11-20 19:55:48 【问题描述】:这是一个我觉得令人费解的 sn-p。为什么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]]
>>>
【问题讨论】:
【参考方案1】:在y = [ [0] * 1 ] * 4
行中,Python 解释器实际上在做的是创建一个列表,其中包含指向同一对象的 4 个指针。您实际上是在创建一个列表 [0]
和对同一列表的 4 个引用。当您更改其中一个时,您将更改所有这些。
【讨论】:
【参考方案2】:这与你初始化y
的方式有关:
y = [ [0] * 1 ] * 4
这基本上是说“创建一个包含单个元素的列表,0
”。然后它说'将该列表四次放入一个新列表中'。因此,如果您更改原始列表,您将更改您创建的所有后续副本(实际上是引用),因为它们每个都指向同一块内存。
【讨论】:
以上是关于二维数组初始化的差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章