我对 python 全局变量及其正确用法的理解存在问题。代码的第一位工作正常,第二位抛出异常“NameError:未定义全局名称'选择'”。我确定我在这里遗漏了一些简单的东西,但我看不到它是什么。
我想将一个侦听器与许多事件生成器中的每一个相关联,然后使用 getChoices 方法获取每个生成器所做选择的字典。
#Working code
class Listener1():
chosen = "0"
def __init__(self, choice):
self.choice = choice
def actionPerformed(self, event):
global chosen
chosen = self.choice
@staticmethod
def getChoices():
return chosen
e1 = Listener1('evt1')
e1.actionPerformed('abc')
print Listener1.getChoices()
失败的代码
class Listener2():
chosen2 = {'a':-1}
def __init__(self, choice):
self.choice = choice
global chosen2
chosen2[self.choice] = 'unset'
def actionPerformed(self, event):
val = event
global chosen2
chosen2[self.choice] = val
@staticmethod
def getChoices():
return chosen2
e2 = Listener2('evt2')
e2.actionPerformed('def')
e3 = Listener2('evt3')
e3.actionPerformed('ghi')
print Listener2.getChoices()
脚注:如果我将对全局变量selected2的第一个引用移动到类定义之前的行而不是之后的行,则 Listener2 类可以正常工作。
感谢下面的答案,代码重写为:
class Listener3():
chosen3 = {}
def __init__(self, choice):
self.choice = choice
if choice is not None:
self.chosen3[self.choice] = 'unset'
def actionPerformed(self, event):
val = event
self.chosen3[self.choice] = val
def getChoices(self):
return self.chosen3
e1 = Listener3('evt1')
e1.actionPerformed('abc')
e2 = Listener3('evt2')
e2.actionPerformed('def')
e3 = Listener3('evt3')
print Listener3(None).getChoices()
{'evt1': 'abc', 'evt2': 'def', 'evt3':'unset'}
除了变得更简单之外,现在还可以完美运行。