【问题标题】:Function changes outside variable unprompted [duplicate]变量外部的函数更改自发[重复]
【发布时间】: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(),否则它应该创建一个单独的副本,但不起作用。

我希望这已经足够描述了;这是我的第一个问题:)

【问题讨论】:

  • 考虑一下。在第一行,您创建了一个包含其他三个列表对象的列表对象。在您的整个程序中,这些是唯一存在的四个列表对象。这些列表有不同的名称,stateboard 都指的是原始列表对象。
  • 全局变量board没有改变,它仍然指的是完全相同的对象,你传递给make_move的对象,并在里面发生了变异。

标签: python


【解决方案1】:

[:] 正在创建所谓的浅拷贝——一个带有从旧对象复制的引用的新对象。要创建深层副本,请使用 copy.deepcopy():

import copy
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_copy = copy.deepcopy(state)
  state_copy[y][x] = 1

  return state_copy

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2019-02-10
    • 2017-07-14
    相关资源
    最近更新 更多