python-chess - глобальная переменная изменяется при запуске функции
Я запутался в том, как работает область видимости Python.
x = 1
def do(y):
y = y * 2
print y
print x
do(x)
print x
Код выше производит этот вывод:
1
2
1
Глобальная переменная остается неизменной, но в функции локальная переменная выводит правильное измененное значение.
Тем не менее, в этой версии Python-шахматы я бегу ниже:
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
1 ответ
Я предполагаю, что поскольку "board" - это какой-то объект, python неявно передает ссылку на объект функции, а не делает его копию. Если вы передаете целочисленные типы, он, скорее всего, просто делает копии. Google "передать объект Python по ссылке" и прочитайте, что вы найдете. Это должно пролить свет на это.