为什么全局化布尔值不奏效而全局化字典有效
这只是一个问题,想知道为什么这个不管用。我已经找到了更好的方法,但我不知道之前为什么不行。
global mydict
mydict = {}
这个方法似乎很好用,而且让我的字典 mydict 成为了全局变量。我甚至打印了 mydict,结果也正常。但是,做这个:
global bool
bool = False
似乎就不行了。如果我在代码中尝试打印 bool,我得到的是:
UnboundLocalError: local variable 'bool' referenced before assignment
那么,为什么字典可以正常工作,而布尔值却不行呢?
哦,还有,如果有人想知道我是怎么找到更好方法的,我初始化了一个类,并通过这样做让布尔值在类中变成全局的:self.bool = False,这样就成功了。我是从这个问题中得到的灵感: 让所有变量变成全局的
补充说明:应要求,我会发布必要的代码:
import chatbot
global mydict
mydict = {}
global haveamessage
haveamessage = False
class MyBot(chatbot.ChatBot):
def __init__(self, username, password, site):
chatbot.ChatBot.__init__(self,username,password,site)
def on_message(self, c, e):
print mydict
print haveamessage
if __name__ == '__main__':
bot = MyBot("MyUsername", "MyPassword", "MySite")
bot.start()
我来解释一下这段代码。基本上,这个聊天机器人模块是为了让用户在 Wikia 上创建机器人,Wikia 是一个允许创建任何人都可以编辑的维基的网站。在维基上有一个聊天扩展,用户可以在这里交流。这个脚本允许一个机器人加入聊天并执行命令。on_message() 函数会在有人在聊天中发言时触发。
所以这段代码会打印:
{}
Traceback (most recent call last):
File "file.py", line 146, in <module>
bot.start()
File "/Library/Python/2.7/site-packages/chatbot.py", line 371, in start
self.on_message(self.c, e)
File "file.py", line 12, in on_message
print haveamessage
UnboundLocalError: local variable 'haveamessage' referenced before assignment
我想澄清一下,大家之所以没有看到错误,是因为你们不在 Wikia 聊天中。on_message() 函数只有在有人在聊天中发言时才会运行。例如,我可能会有:
def on_message(self, c, e):
if e.text == 'hello': # e.text is what a user posts in the chat. e = event
c.send('Hello!') # c.send simply sends back a message in the chat. c = connection
所以当有人在聊天中发“hello”时,机器人会回复“Hello!”
2 个回答
我觉得你想做的是定义全局变量,然后在你的函数里引用这些变量,这样你就可以在函数内部使用它们了:
import chatbot
mydict = {}
haveamessage = False
class MyBot(chatbot.ChatBot):
def __init__(self, username, password, site):
chatbot.ChatBot.__init__(self,username,password,site)
def on_message(self, c, e):
global mydict
global haveamessage
print mydict
print haveamessage
你发的代码并没有产生你所说的错误。不过,在函数外面使用 global
这个关键词是没有任何作用的,所以它没有像你预期的那样工作也就不奇怪了。
我猜在你的真实代码中,你其实是想在 on_message
这个函数里给 haveamessage
赋值。如果是这样的话,你需要在这个方法里加一个 global
声明。
简单来说,规则是这样的:如果你想在一个函数里给全局变量赋值,就必须在这个函数里使用 global
关键词。否则,你根本不需要用 global
。变量是否是布尔值(true 或 false)并没有影响。