Python問題:UnboundLocalError: local variable 'xxx' referenced before assignment


 

參考鏈接:

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

 

這種情況困擾我很久,一直找不出問題,最后我定義了新的列表來裝返回值,程序暫時不出問題了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM