class AlphaBetaAgent(MultiAgentSearchAgent):
def action(self,gamestate):
self.alpha= -9999
self.beta = 9999
def abc(gamestate, depth, alpha, beta):
def bvc(gamestate, depth, alpha, beta):
return abc(gamestate, 0, alpha, beta)
Я вызываю getAction функцию который, саму называя abc funct и функцию abc вызов bvc funct. Abc функций и bvc работают рекурсивным способом. Я должен изменить значения альфы и беты согласно требованиям ситуации, таким образом, я сделал их локальными. НО это не позволяет мне, чтобы сделать это. Ошибка происходит
Ошибка происходит:-глобальное имя 'альфа' не определяется
В Python глобальные переменные должны быть объявлены вне функции. Тогда любая функция может прочитать эту переменную без каких-либо проблем, но если функция хочет записать в нее, она должна объявить ее глобальной. Пример:
def fun1():
print a
def fun2():
a = 3
def fun3():
global a
a = 3
a = 0
fun1() # <- Will work
fun2() # <- Will raise exception
fun3() # <- Will work
Чтобы использовать глобальную переменную, вы должны сделать что-то вроде:
global alpha
alpha = -9999
Если вы хотите, чтобы такие функции, как 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
больше не нужно определять внутри действия
. Причина, по которой это работает, а ваш пример - нет, заключается в том, что Python лексически связывает любой примитивный идентификатор с самой локальной функцией, которой он назначен. Поэтому, когда вы назначаете альфа
в abc
, Python определяет альфа
как локальный для abc
, а не для действия
. Я считаю, что единственный способ получить закрытие в Python - не назначать вложенную переменную во внутренней функции.
Используйте класс. Классы предназначены для хранения состояния и поведения.