python-chess - 函数运行时全局变量发生变化

时间:2017-07-23 19:57:30

标签: python function variables scope python-chess

我对Python范围如何在这里工作感到困惑。

x = 1

def do(y):
    y = y * 2
    print y

print x
do(x)
print x

上面的代码产生了这个输出:

1
2
1

全局变量保持不变,但在函数中,局部变量打印出正确的更改值。

然而,在这个python-chess版本中,我在下面运行:

import chess
board = chess.Board()

def do(b):
    b.push(list(b.legal_moves)[0]) #picks the first legal move
    return b.fen()

print board.fen()
print do(board)
print board.fen()

它产生这个输出:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - 1 1
rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - 1 1

意外(至少对我而言)全局变量board在函数运行后发生了变化。

我认为您要使用global关键字更改function creates a local variable instead of modifying the global variable - it seems you even need to imply specifically。它似乎适用于我使用的简单乘法示例,或许它是由于.push()方法python-chess提供的?

运行该函数后如何保留全局变量的值?

在这种情况下,我想要的输出应该是:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b KQkq - 1 1
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

1 个答案:

答案 0 :(得分:0)

我的猜测是因为" board"是某种对象,python隐式将对象的引用传递给函数,而不是复制它。如果你传递整数类型,它很可能只是复制。 Google" python对象通过引用传递"并阅读你找到的。这应该为它提供一些启示。