Skip to main content
 首页 » 编程设计

python之为什么全局化 boolean 值不起作用但全局化字典却有效

2025年05月04日19over140

这只是一个问题,想知道为什么这不起作用。我想出了一个更好的方法,但我不知道为什么以前它不起作用。

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 值没有区别。