2013-01-20 57 views
1

這只是一個問題,想知道爲什麼這不起作用。我已經想出了一個更好的方法,但我不知道爲什麼以前它不工作。爲什麼全球化一個布爾不工作,但全球化的字典

global mydict 
mydict = {} 

這似乎工作正常,並已使mydict字典全球。我甚至打印mydict,它的工作原理。但是,這樣做:

global bool 
bool = False 

似乎沒有工作。如果試圖在我的代碼中打印布爾,我得到:

UnboundLocalError: local variable 'bool' referenced before assignment 

那麼,爲什麼它的字典而不是布爾值呢?

哦,還有,如果有人想知道我是怎麼想出更好的辦法的,那麼我就通過做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() 

我會盡力解釋這個代碼。 chatbot模塊非常適合用戶在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 

所以當有人發帖在聊天你好,機器帖子回來你好!

+4

請發佈一個可重現問題的小型可運行代碼示例。 – sepp2k

+2

@Haidro當我運行該代碼時,出現導入錯誤。修改該代碼以刪除錯誤之後,沒有任何反應。在添加一些代碼來實例化MyBot並在其上調用on_message之後,它會打印出{}和False。您聲稱獲得的錯誤消息從未發生。 – sepp2k

+0

我已經添加了我的代碼,並且出現了錯誤。 – TerryA

回答

5

你已經發布的代碼不會產生你的錯誤聲稱它。但是,在函數之外使用關鍵字global沒有任何效果,因此它不會像您期望的那樣工作。

我假設在你真實的代碼中,你實際上試圖在on_message裏面指定haveamessage。如果是這樣,您需要在該方法中使用global語句。

基本上規則是:如果您嘗試從函數內分配全局變量,則需要在該函數內使用關鍵字global。否則,你根本不需要global關鍵字。無論變量是否爲布爾值都沒有區別。

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 
+3

讀取全局變量時不需要使用'global',只有在分配它們時才需要使用'global'。 – sepp2k

+0

當然,但正如你在答案中所說的那樣,如果有一項任務試圖在本地完成,全局變量需要在那裏。我只是表明OP應該在分配原始值時刪除全局關鍵字,然後在函數中使用全局函數,以便它們可以用於任何OP需求並使其按預期工作(全局變量更改,而不是本地的)。 – mgoffin