python - 将二维 python 列表初始化为 [[9]*3]*3 似乎创建了对同一数组的引用。这是怎么回事?

标签 python arrays list

根据数组的初始化方式,二维数组的更新似乎会有所不同。

t = [[-9]*3]*3
t[0][1] = 5
#[[-9, 5, -9], [-9, 5, -9], [-9, 5, -9]]

这是意外的,因为每一行都会更新(第二列的值为 5)。

将其与以下内容进行对比:

t = [[-9, -9, -9], [-9, -9, -9], [-9, -9, -9]]
t[0][1] = 5
#[[-9, 5, -9], [-9, -9, -9], [-9, -9, -9]]

这符合预期。幕后发生了什么?

最佳答案

当您在 Python 中使用 * 运算符重复列表时,它只是创建对原始列表的重复引用,而不是创建多个独立列表。您可以使用Python的id函数来查找任何Python值的内部标识号,它可以用来判断两个相似的值实际上是否不同。例如:

>>> t = [[9]*3]*3
>>> t
[[9, 9, 9], [9, 9, 9], [9, 9, 9]]
>>> id(t[0])
4354326848
>>> id(t[1])
4354326848
>>> id(t[2])
4354326848


>>> t = [[-9, -9, -9], [-9, -9, -9], [-9, -9, -9]]
>>> id(t[0])
4354326912
>>> id(t[1])
4354327616
>>> id(t[2])
4354327168

观察第一种情况,所有三个 id 号都相同,而在第二种情况中,它们都不同。

因此,在第一种情况下,您确实对同一基础列表有三个引用,并且当您更改其中一个元素时,它们都会一起更改(因为它们实际上都是一个列表)。

关于python - 将二维 python 列表初始化为 [[9]*3]*3 似乎创建了对同一数组的引用。这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59925864/

相关文章:

python - 如何检测多个附加图像并将其剪掉?

python - 我需要用从该向量中获取的值来填充矩阵

arrays - 使用 Ruby 生成多重集的分区

vba - 如何在 vba 中创建循环迭代 block 中的列表?

r - 将数据框转换为列表的树形结构列表

python - GAE : use static HTML file vs database to serve contents

python - 在Python中绘制Z平面上的复数列表

Javascript 数组比较问题

arrays - 从每个数组中删除是否安全?

python - 当两行具有相同的第一个值时,如何将一行的数据添加到另一行