Python 3.x 为什么Python2D数组访问会修改整个列

Python 3.x 为什么Python2D数组访问会修改整个列,python-3.x,Python 3.x,我对以这种方式初始化2D数组感到困惑: >>> a = [[0] * 3] * 3 >>> a [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> a[0][0] = 1 >>> a [[1, 0, 0], [1, 0, 0], [1, 0, 0]] 当我期待的时候 [[1, 0, 0], [0, 0, 0], [0, 0, 0]] 我也试过了 >>> a = [[0 for _

我对以这种方式初始化2D数组感到困惑:

>>> a = [[0] * 3] * 3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
当我期待的时候

[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
我也试过了

>>> a = [[0 for _ in range(3)] for _ in range(3)]
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
果然奏效了


想知道这是什么原因吗?

用outter
*3
你正在制作一个列表的浅拷贝

这可以通过打印ID轻松验证。每个项目都有一个唯一的id

a = [[0] * 3] * 3
print(*map(id, a))
# Same ID
相反,您绝对需要生成新的列表

a = [[0] * 3 for _ in range(3)]
print(*map(id, a))
# Different ids

如果您想了解更多信息,可以检查以下问题:

使用outter
*3
您正在制作列表的浅表副本

这可以通过打印ID轻松验证。每个项目都有一个唯一的id

a = [[0] * 3] * 3
print(*map(id, a))
# Same ID
相反,您绝对需要生成新的列表

a = [[0] * 3 for _ in range(3)]
print(*map(id, a))
# Different ids

如果您想了解更多信息,可以检查以下问题:

因为在第一个代码中,x3对同一列表进行了3次引用因为在第一个代码中,x3对同一列表进行了3次引用始终认为它们是等效的,谢谢您的回答。始终认为它们是等效的,谢谢您的回答。