【发布时间】:2021-10-12 18:27:13
【问题描述】:
我正在创建一个简单的 Minimax 算法来玩井字游戏。函数make_move() 接受棋盘和 x/y 坐标并返回具有给定移动的棋盘。我使用此功能来进行移动并创建子板列表以选择最佳下一步。
我的问题:每当我调用该函数时,它都会更改全局 board 变量以反映移动。我不使用board = make_move(),也尝试使用带有board 副本的函数,但没有效果。这是我的代码的更简单版本:
board = [ [0 for x in range(3)] for y in range(3) ] # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
def make_move(state, x, y): # return board with given move made
state[y][x] = 1
return state
print(make_move(board, 1, 1)) # prints [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
print(board) # also prints [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
我的问题:因为我没有指定board = make_move(board, ...),这显然会改变原来的board 变量,我在这里做错了什么导致board 改变?
将 board[:] 而不是 board 传递给 make_move(),否则它应该创建一个单独的副本,但不起作用。
我希望这已经足够描述了;这是我的第一个问题:)
【问题讨论】:
-
考虑一下。在第一行,您创建了一个包含其他三个列表对象的列表对象。在您的整个程序中,这些是唯一存在的四个列表对象。这些列表有不同的名称,
state和board都指的是原始列表对象。 -
全局变量
board没有改变,它仍然指的是完全相同的对象,你传递给make_move的对象,并在里面发生了变异。
标签: python