глобальные переменные в питоне - PullRequest
0 голосов
/ 03 августа 2010
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, а функцию abc - функцию bvc.Функции abc и bvc работают рекурсивно.Мне нужно изменить значения альфа и бета в соответствии с требованиями ситуации, поэтому я сделал их локальными.Но это не позволяет мне сделать это.Произошла ошибка

Произошла ошибка: - глобальное имя 'alpha' не определено

Ответы [ 4 ]

3 голосов
/ 03 августа 2010

В 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
2 голосов
/ 03 августа 2010

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

1 голос
/ 03 августа 2010

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

0 голосов
/ 03 августа 2010

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

глобальная альфаальфа = -9999

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...