根据数组的初始化方式,二维数组的更新似乎会有所不同。
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/