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 по ссылке" и прочитайте, что вы найдете. Это должно пролить свет на это.

Другие вопросы по тегам