0

我对 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
4

1 回答 1

0

我的猜测是,因为“板”是某种对象,python 隐式地将对象的引用传递给函数,而不是复制它。如果您传递整数类型,它很可能只是复制。谷歌“python object pass by reference”并阅读您找到的内容。这应该会有所启发。

于 2017-07-23T20:05:11.120 回答