我对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 意外地发生了变化(至少对我来说是这样)。
我认为您希望通过使用function creates a local variable instead of modifying the global variable - it seems you even need to imply specifically关键字来更改它。它似乎适用于我使用的简单乘法示例,可能是因为python提供的.push()方法?
在运行函数时如何保留全局变量的值?
在这种情况下,我想要的输出应该是:
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发布于 2017-07-23 20:05:11
我的猜测是,因为"board“是某种对象,python隐式地将对象的引用传递给函数,而不是复制它。如果你通过积分类型,它很可能只是复制。Google "python对象通过引用传递“并阅读您发现的内容。这应该会给它一些启示。
https://stackoverflow.com/questions/45269355
复制相似问题