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 的函数,abc 函数又在调用一个叫 bvc 的函数。这些函数 abc 和 bvc 是以递归的方式运行的,也就是说它们会不断地调用自己。我需要根据情况来修改 alpha 和 beta 的值,所以我把它们设置成了局部变量。但这样做却出现了问题,系统提示我有错误。
错误信息是:全局变量 'alpha' 没有定义。
4 个回答
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)
另外,如果你真的想这么做,你可以用一个可变的对象,比如字典,来存放你的数据:
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 会把任何基本的标识符绑定到它被赋值的最近的函数里。所以当你在 abc
中给 alpha
赋值时,Python 会把 alpha
定义为 abc
的局部变量,而不是 action
的。 我认为在 Python 中获得闭包的唯一方法是不要在内部函数中给封闭的变量赋值。
2
用类来处理。类的作用就是用来存储状态和行为的。
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