我对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
答案 0 :(得分:0)
我的猜测是因为" board"是某种对象,python隐式将对象的引用传递给函数,而不是复制它。如果你传递整数类型,它很可能只是复制。 Google" python对象通过引用传递"并阅读你找到的。这应该为它提供一些启示。