为什么当我尝试从列表中更改索引时会发生这种情况?


Input = 5
GM1 = [0 for x in range(Input)]
GameBoard = [GM1 for x in range(Input)]
print(*GameBoard, sep="n")
GameBoard[1][1] = 5
print(*GameBoard, sep="n")

那么在最后的print语句中,我期望得到这样的结果:

[0, 0, 0, 0, 0]
[0, 5, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

但是我得到了

[0, 5, 0, 0, 0]
[0, 5, 0, 0, 0]
[0, 5, 0, 0, 0]
[0, 5, 0, 0, 0]
[0, 5, 0, 0, 0]

为什么会发生这种情况,我该如何解决?

我想问题出在我使用的列表推导式上。

试试这个:

GameBoard = [GM1.copy() for x in range(Input)]

这篇文章将帮助你理解发生了什么:不可变与可变类型

我该如何解决这个问题?

这很简单:

GameBoard = [[0]*Input for _ in range(Input)]

问题不在于列表理解,而在于所谓的混叠。在你的例子中,这意味着GameBoard实际上是五次引用同一个对象'GM1'。

当你修改GameBoard一行中的一个项目时,你实际上是在修改GM1列表索引1处的项目,该列表由GameBoard的所有行共享。由于GM1被用作GameBoard的行,这意味着该更改应用于GameBoard的所有行。

这个问题可以通过复制GM1来避免,而不是直接引用,正如iYasha在他们的回答中指出的:

GameBoard = [GM1.copy() for x in range(Input)]

每一行将是一个单独的列表,因此修改列表中的一个项目不会影响其他行(列表)。

相关内容

最新更新