Python中的函数设置全局变量

Function in Python Setting Global Variables (without intent)

我不知道这是否是其他人遇到的问题,但我在Python中有这样的代码:

1
2
3
4
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()设置您输入的变量。有什么明显的东西我不见了吗?


您需要克隆board

1
2
import
new = copy.deepcopy(board)

其他方法请参见https://stackoverflow.com/a/2612815/93910。

您的代码将变量的元素设置为"引用"。换句话说,您的变量new实际上是对board的数组引用,即它指向相同的内存位置。所以当你改变new时,原来的变量board就会改变。

下面是另一个如何思考的答案:https://stackoverflow.com/a/9697367/93910


这基本上是因为在Python中的赋值并不意味着您认为它可以做什么,而且列表是可变序列。

列表是python对象。名称board只是该对象的标签或引用。所以当你说new=board时,这意味着"让名称new引用与名称board相同的对象"。

在Python中,每个对象都有一个唯一的标识符,您可以使用id()检索该标识符。让我们创建一个董事会,完成任务,看看会发生什么:

1
2
3
4
5
6
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进行复制和修改。