二维数组初始化的差异[重复]

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”。然后它说'将该列表四次放入一个新列表中'。因此,如果您更改原始列表,您将更改您创建的所有后续副本(实际上是引用),因为它们每个都指向同一块内存。

【讨论】:

以上是关于二维数组初始化的差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章

创建初始重复数据的二维字符串数组的最有效方法是啥?

Java - 在构造函数中初始化数组[重复]

C语言 写个给二维数组初始化的函数

存储指向二维数组的指针[重复]

c语言二维数组如何初始化

如何用js push() 初始化一个二维数组