Python中的函数设置全局变量(无意图)

时间:2017-03-16 16:49:06

标签: function python-3.x variables

我不知道这是否是其他人得到的问题,但我在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()设置你放入它的变量。我有什么明显的遗失吗?

2 个答案:

答案 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)

newboard引用同一个对象。

由于列表是一个可变序列,您可以更改它而不会出错。

因此,如果您想在函数内部使用任何可变序列而不修改原始序列,则应首先使用copy.deepcopy复制并修改它。