глобальные переменные в Python

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 работают рекурсивным способом. Я должен изменить значения альфы и беты согласно требованиям ситуации, таким образом, я сделал их локальными. НО это не позволяет мне, чтобы сделать это. Ошибка происходит

Ошибка происходит:-глобальное имя 'альфа' не определяется

0
задан Shilpa 2 August 2010 в 21:33
поделиться

4 ответа

В 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
3
ответ дан 4 September 2019 в 00:46
поделиться

Чтобы использовать глобальную переменную, вы должны сделать что-то вроде:

global alpha
alpha = -9999

0
ответ дан 4 September 2019 в 00:46
поделиться

Если вы хотите, чтобы такие функции, как 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 - не назначать вложенную переменную во внутренней функции.

1
ответ дан 4 September 2019 в 00:46
поделиться

Используйте класс. Классы предназначены для хранения состояния и поведения.

2
ответ дан 4 September 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: