2013-01-12 29 views
0

當我運行了以下功能:的Python - 古怪的UnboundLocalError

def checkChange(): 
    for user in userLinks: 
     url = userLinks[user] 
     response = urllib2.urlopen(url) 
     html = response.read() 

我得到

Traceback (most recent call last): 
    File "InStockBot.py", line 34, in <module> 
    checkChange() 
    File "InStockBot.py", line 24, in checkChange 
    html = response.read() 
UnboundLocalError: local variable 'response' referenced before assignment 

這是沒有意義的我。我沒有全局變量響應。通常情況下,我希望它能像以下那樣工作。

>>> url="http://google.com" 
>>> response = urllib2.urlopen(url) 
>>> html = response.read() 
>>> html 
'<!doctype html> 

任何人都知道爲什麼會出現此錯誤?

+1

你能發佈你所有的代碼嗎? – Blender

+1

它在這裏:http://pastebin.com/n04NGRYv – TheoretiCAL

回答

1

你在混合標籤和空格。查看您粘貼的原始代碼:

' def checkChange():' 
' \tfor user in userLinks:' 
' \t\turl = userLinks[user]' 
' \t\tresponse = urllib2.urlopen(url) ' 
'   html = response.read()' 

您可以在最後一行看到開關。實際上,這意味着html = response.read()線不受限制,只要你認爲它是,這意味着縮進,如果userLinks是空的,你會得到:

Traceback (most recent call last): 
    File "inde.py", line 10, in <module> 
    checkChange() 
    File "inde.py", line 5, in checkChange 
    html = response.read() 
UnboundLocalError: local variable 'response' referenced before assignment 

使用python -tt yourprogramname.py確認該運行你的代碼,並且開關始終使用四空間選項卡。

+0

感謝-tt提示! – TheoretiCAL

1

您的代碼沒有正確縮進。將其更改爲這一點,它會工作(可能不會如預期,但它會工作):因爲您在for循環定義response發生

for user in userLinks: 
    url = userLinks[user] 
    response = urllib2.urlopen(url) 
    html = response.read() 

    if userSources[user] != html: 
     del userSources[user] 
     del userLinks[user] 
     api.PostDirectMessage(user,'It appears the page has updated! Your item may be back in stock!') 

的錯誤,但如果循環不運行(即userLinks == []),該變量從未設置。