局部變量錯誤

【解析】

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章