在Python 2.7中为什么grid = [["A"]*5]*5与grid = [] grid.append [...]不同

mar*_*st2 4 python list append python-2.x python-2.7

我试图在python 2.7中构建一个5x5网格的游戏板,表示为2维列表.我尝试将其编写为board = [["O"]*cols]*rows(cols和rows已经声明为5)但是当我尝试编辑索引处的值时,它会更改整行.例如

cols = 5
rows = 5
board = [["O"]*cols]*rows
Run Code Online (Sandbox Code Playgroud)

这打印:

[['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O']]
Run Code Online (Sandbox Code Playgroud)

现在当我尝试更改索引的值时:

board[1][1] = "X"
Run Code Online (Sandbox Code Playgroud)

它打印:

[['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O']]
Run Code Online (Sandbox Code Playgroud)

我只想改变第1行第1行的值.

我也尝试过以下方法:

board = []
for i in xrange(5):
    board.append(["O"]*cols)
Run Code Online (Sandbox Code Playgroud)

这个就像我想要的那样.我想了解的是有什么区别?

Mar*_*agh 5

如果你评估下面的表达式,你将看到它将为你的第一个例子返回True,但对另一个例子则返回False.两个列表实际上都指向内存中的相同单个列表.

board[0] is board[1]

如果你想要一个制作不同新列表的简短版本,那么这个版本也可以正常工作.

board = [["O"]*cols for y in range(rows)]
Run Code Online (Sandbox Code Playgroud)