我对 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
关键字来更改它。它似乎在我使用的简单乘法示例中有效,也许是由于.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