为什么全局化布尔值不奏效而全局化字典有效

5 投票
2 回答
20366 浏览
提问于 2025-04-17 13:16

这只是一个问题,想知道为什么这个不管用。我已经找到了更好的方法,但我不知道之前为什么不行。

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 个回答

0

我觉得你想做的是定义全局变量,然后在你的函数里引用这些变量,这样你就可以在函数内部使用它们了:

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
7

你发的代码并没有产生你所说的错误。不过,在函数外面使用 global 这个关键词是没有任何作用的,所以它没有像你预期的那样工作也就不奇怪了。

我猜在你的真实代码中,你其实是想在 on_message 这个函数里给 haveamessage 赋值。如果是这样的话,你需要在这个方法里加一个 global 声明。

简单来说,规则是这样的:如果你想在一个函数里给全局变量赋值,就必须在这个函数里使用 global 关键词。否则,你根本不需要用 global。变量是否是布尔值(true 或 false)并没有影响。

撰写回答