我不知道这是否是其他人得到的问题,但我在python中的代码是这样的:
def makemove(board,move,val):
new=board
new[move[0]][move[1]]=val
return new
我的问题是如果我通过简单地做makemove(游戏,[0,1], - 1)来使用这个功能,其中游戏等于[[0,0,1],[0,1,0],[1 ,0,0]]变量游戏变为[[0,-1,1],[0,1,0],[1,0,0]]。
我试图查看设置全局变量的函数,但我没有找到一种方法来阻止makemove()设置你放入它的变量。我有什么明显的遗失吗?
答案 0 :(得分:2)
您需要克隆board
。
import
new = copy.deepcopy(board)
请参阅https://stackoverflow.com/a/2612815/93910了解其他方法。
您的代码设置变量的元素,这是"引用"。
换句话说,您的变量new
实际上是对board
的数组引用,即它指向相同的内存位置。因此,当您更改new
时,原始变量board
会发生变化。
以下是关于如何思考这个问题的另一个答案:https://stackoverflow.com/a/9697367/93910
答案 1 :(得分:1)
这基本上是因为Python中的赋值并不代表你的想法,而且列表是可变序列。
列表是Python对象。 名称 board
仅是该对象的标签或引用。
因此,当您说new=board
时,这意味着"让名称new
引用与名称board
"相同的对象。
在Python中,每个对象都有一个唯一的标识符,您可以使用id()
来检索它。让我们创建一个董事会,完成任务并看看会发生什么:
In [1]: board = [[0,0,1],[0,1,0],[1,0,0]]
In [2]: new = board
In [3]: id(new), id(board)
Out[3]: (34495504136, 34495504136)
new
和board
引用同一个对象。
由于列表是一个可变序列,您可以更改它而不会出错。
因此,如果您想在函数内部使用任何可变序列而不修改原始序列,则应首先使用copy.deepcopy
复制并修改它。