python中的全局变量

时间:2010-08-02 20:54:08

标签: python variables function

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和beta的值,所以我把它们变成了本地的。不,这不是让我这样做的。发生错误

发生错误: - 未定义全局名称'alpha'

4 个答案:

答案 0 :(得分:3)

在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

答案 1 :(得分:2)

使用课程。存储状态&amp;行为是什么类。

答案 2 :(得分:1)

如果希望abcbvc等函数使用公共变量,通常需要为它们定义一个对象,如下所示:

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)

或者,如果你真的想要,你可以附上一个像dict一样的可变对象来保存你的数据:

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参数 - 它是从封闭范围继承的。如果需要,您可以明确地传递它,在这种情况下,abcbvc不再需要在action内定义。这样做的原因和你的例子不是Python将任何原始标识符从词汇上绑定到分配它的最本地函数。因此,当您在alpha中分配给abc时,Python会将alpha定义为abc的本地,而不是action。我相信在Python中获取闭包的唯一方法是不在内部函数中分配封闭变量。

答案 3 :(得分:0)

要使用全局变量,您必须执行以下操作:

全球阿尔法 alpha = -9999