參考鏈接:
http://blog.csdn.net/onlyanyz/article/details/45009697
https://www.cnblogs.com/fendou-999/p/3822028.html
【解析】
UnboundLocalError: local variable 'xxx' referenced before assignment
在函數外部已經定義了變量n,在函數內部對該變量進行運算,運行時會遇到了這樣的錯誤:
主要是因為沒有讓解釋器清楚變量是全局變量還是局部變量。
【案例】
如下代碼片所示:
def test(): if value == 1: a += 1 return a value = a = 1 b = test()
結果運行時就出現了上述錯誤。
這是因為在函數內部對變量賦值進行修改后,該變量就會被Python解釋器認為是局部變量而非全局變量,當程序執行到a+=1的時候,因為這條語句是給a賦值,所以a成為了局部變量,那么在執行return a(或是print a)的時候,因為a這個局部變量還沒有定義,自然就會拋出這樣的錯誤。
那么問題就來了,出現這個問題我們就要考慮程序是按照全局變量,就是經過函數運算到函數外面還生效,還是按照局部變量在函數外生效。
第一種,當全局變量來看,就是使用global關鍵字,在函數內部先聲明a這個變量是全局變量。代碼如下:
def test(): global a if value == 1: a += 1 return a value = a = 1 b = test()
這時,n就成為了全局變量,在函數內部修改該變量,也就沒有問題了。
這種情況外面的a執行完函數是2,而函數返回的也是2。
第二種是當局部變量。就是這個變量只在函數內使用,那么只要在函數內把這個變量定義一下就行了
def test(): a = 1 if value == 1: a += 1 return a value = a = 1 b = test()
這種情況外面的a執行完函數還是1,而函數返回的則是2。
然而我還發現一個問題,理論上python中list作為全局變量無需global聲明,因為像b[0] = 2這種賦值不會有歧義。它是“明確的”,因為如果把b當作是局部變量的話,它會報KeyError,所以它只能是引用全局的b,故不需要多此一舉顯式聲明global。
但是我在實際操作中,在函數外定義列表,在函數中多次添加值,而后在return打印出來。執行次數少沒有問題,隨着循環次數的增加會出現,此報錯,報錯信息如下:
Traceback (most recent call last):
File "C:/Users/xxxxxx/Desktop/工具/get_url2.py", line 153, in <module>
r_get_url_list,script_list,html_list,other_list,suffix_list = please_geturl(url,s_url)
File "C:/Users/xxxxxx/Desktop/工具/get_url2.py", line 93, in please_geturl
if get_url_list: # 非空列表
UnboundLocalError: local variable 'get_url_list' referenced before assignment
這種情況困擾我很久,一直找不出問題,最后我定義了新的列表來裝返回值,程序暫時不出問題了