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

问题描述 投票:0回答:2

这是我觉得令人费解的片段。为什么

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]]
>>> 
python multidimensional-array
2个回答
1
投票

y = [ [0] * 1 ] * 4
行中,Python 解释器实际上正在做的是创建一个包含 4 个指向同一对象的指针的列表。您实际上正在创建一个列表
[0]
以及对同一列表的 4 个引用。当你改变其中之一时,你就改变了所有。


1
投票

这与您的初始化方式有关

y

y = [ [0] * 1 ] * 4

这基本上是说“创建一个包含单个元素的列表,

0
”。然后它说“将该列表四次放入新列表中”。因此,如果您更改原始列表,您就会更改您所做的所有后续副本(实际上是引用),因为它们都指向同一块内存。

© www.soinside.com 2019 - 2024. All rights reserved.