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'
答案 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)
如果希望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)
或者,如果你真的想要,你可以附上一个像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
参数 - 它是从封闭范围继承的。如果需要,您可以明确地传递它,在这种情况下,abc
和bvc
不再需要在action
内定义。这样做的原因和你的例子不是Python将任何原始标识符从词汇上绑定到分配它的最本地函数。因此,当您在alpha
中分配给abc
时,Python会将alpha
定义为abc
的本地,而不是action
。我相信在Python中获取闭包的唯一方法是不在内部函数中分配封闭变量。
答案 3 :(得分:0)
要使用全局变量,您必须执行以下操作:
全球阿尔法 alpha = -9999