这只是一个问题,想知道为什么这不起作用。我想出了一个更好的方法,但我不知道为什么以前它不起作用。
global mydict
mydict = {}
这似乎工作正常,并且使 mydict 字典成为全局的。我什至打印 mydict 并且它有效。但是,这样做:
global bool
bool = False
好像不行。如果尝试在我的代码中打印 bool,我得到:
UnboundLocalError: local variable 'bool' referenced before assignment
那么为什么它适用于字典而不适用于 boolean 值?
哦,另外,如果有人想知道我是如何找到更好的方法的,我初始化了一个类,并通过执行以下操作使 bool 在类中成为全局变量:self.bool = False,这很有效。我从这个问题得到它:Making all variables global
编辑:根据要求,我将发布必要的代码:
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 的维基中创建机器人,维基是一家允许创建任何人都可以编辑的维基的公司。在 wiki 上有一个聊天扩展,用户可以与之交谈。该脚本允许机器人加入聊天并执行命令。 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
因此,当有人在聊天问候中发帖时,机器人会回复你好!
请您参考如下方法:
您发布的代码不会产生您声称的错误。但是,在函数外部使用 global 关键字没有任何效果,因此它不会像您预期的那样工作也就不足为奇了。
我假设在您的真实代码中,您实际上是在尝试在 on_message 中分配给 haveamessage。如果是这样,您需要在该方法中使用 global 语句。
基本上规则是:如果您尝试从一个函数中分配一个全局变量,您需要在该函数中使用 global 关键字。否则你根本不需要 global 关键字。变量是否为 boolean 值没有区别。
