Если вы хотите, чтобы такие функции, как abc
и bvc
, использовали общие переменные, вы, как правило, хотите определить для них объекты, которые будут методами, например:
class ActionState(object):
def abc(self, gamestate, depth):
self.alpha = -9999
self.beta = 9999
def bvc(self, gamestate, depth):
self.alpha = -9999
self.beta = 99999
def action(self, gamestate):
state = ActionState()
state.abc(gamestate, 0)
В качестве альтернативы, если вы действительно хотите, вы можете заключить изменяемый объект, например, в диктовку, чтобы хранить ваши данные:
def action(self, gamestate):
actionstate = { 'alpha': 0, 'beta': 0 }
def abc(gamestate, depth):
actionstate['alpha'] = -9999
actionstate['beta'] = 9999
def bvc(gamestate, depth):
actionstate['alpha'] = -9999
actionstate['beta'] = 9999
abc(gamestate, 0)
Обратите внимание, что параметр actionstate
здесь не передается - он наследуется от охватывающей области. Вместо этого вы можете передать это явное объяснение, в этом случае abc
и bvc
больше не нужно определять внутри action
. Причина, по которой это работает, а ваш пример - нет, заключается в том, что Python связывает любой примитивный идентификатор лексически с самой локальной функцией, которой он назначен. Поэтому, когда вы присваиваете alpha
в abc
, Python определяет alpha
как локальный для abc
, а не action
. Я считаю, что единственный способ получить замыкание в Python - это не назначать вложенную переменную во внутренней функции.