【问题标题】:global variables in pythonpython中的全局变量
【发布时间】:2010-08-02 20:54:08
【问题描述】:
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”

【问题讨论】:

  • 请修正缩进。在 Python 中,它有点很重要。
  • 是的,它有点难以阅读;)
  • 我建议重写你的函数,让它真正做一些事情,而不是无用地为函数参数赋值并试图返回一个没有返回值的函数的值。
  • 我正在使用这些变量,但我没有把整个代码放在这里...
  • -1:“我正在调用 getAction 函数”。但是,示例代码中没有显示getAction 方法。

标签: python variables function


【解决方案1】:

在 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

【讨论】:

  • name 'beta' 是一个函数参数并声明为全局 - 当我应用你的方法时会出现这样的错误
  • 我不确定您的问题到底是什么。如果您想在函数中使用局部变量并在不担心全局变量的情况下操作它们,那通常可以正常工作。通过在函数内部声明一个函数,我不太确定你在做什么。你试过上课吗?
  • 有一个类,其中定义了一个函数Ge​​taction,在getAction fnction中,我又做了2个函数
【解决方案2】:

使用类。存储状态和行为是类的用途。

【讨论】:

  • +1:避免使用全局变量。它们通常是一个可怕的设计错误。
【解决方案3】:

如果您希望 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 将任何原始标识符在词法上绑定到分配它的最本地函数。因此,当您在abc 中分配给alpha 时,Python 将alpha 定义为abc 的本地地址,而不是action。我相信在 Python 中获得闭包的唯一方法是不要分配给内部函数中的封闭变量。

【讨论】:

  • abc 和 bvc 函数在函数 getAction 中定义。那么我在哪里准确定义我的 alpha 和 beta....我不能使用 self.alpha??
  • alphabeta 必须定义为在 abcbvc 的定义之上创建的字典或对象的组件。这样您就可以分配给它们,而无需在更本地的范围内创建第二个版本。请参阅答案末尾的附加说明。
  • 还有,为什么不能用self.alpha
  • 当我使用 self.alpha 和 self.beta 时,会发生错误。我没有写函数 def abc(self,gamestate,alpha, beta) - 它是 def abc(gamestate, depth,alpha , beta)
  • 看我的第一个示例代码——如果你使用一个对象,你必须改变abcbvc的方法签名。您在开头添加 self 并删除 alpha 和 beta 参数,因为它们保留在 self 内。然后你调用abcbvc 作为方法而不是函数,所以它们得到了隐式的self 参数,正如我的示例中所展示的那样。请注意,仅仅因为某个函数在您在某处找到的某些伪代码中具有特定的签名,当您编写它时,它不一定必须看起来像那样,只要完成相同的工作!
【解决方案4】:

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

全局阿尔法
阿尔法 = -9999

【讨论】:

  • 否,当我将 alpha 和 beta 的值放入函数中时,会发生错误,例如未定义全局名称“alpha”。当我在 def abc 之外声明 alpha 和 beta 时,它工作正常。我想使用 alpha nd beta 的局部变量。
猜你喜欢
  • 2019-07-24
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多