區域性變數錯誤

2021-10-06 21:54:09 字數 1699 閱讀 4717

unboundlocalerror: local variable '***' 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/******/desktop/工具/get_url2.py", line 153, in

r_get_url_list,script_list,html_list,other_list,suffix_list = please_geturl(url,s_url)

file "c:/users/******/desktop/工具/get_url2.py", line 93, in please_geturl

if get_url_list: # 非空列表

unboundlocalerror: local variable 'get_url_list' referenced before assignment

成員變數 區域性變數

成員變數 作為類的成員而存在,直接存在於類中。所有類的成員變 量可以通過this來引用。區域性變數 作為方法或語句塊的成員而存在,存在於方法的引數列表和方法定義中。1.成員變數可以被 public,protect,private,static等修飾符修飾,而 區域性變數不能被控制修飾符及 stati...

成員變數 區域性變數

一.相同點 1.都遵循變數的宣告格式 修飾符 資料型別 變數名 初始化值 2.都有各自的作用域 二.不同點 1.宣告的位置不同 成員變數 宣告在類內,方法外。區域性變數 宣告在方法內 方法的形參部分 塊內 2.成員變數的修飾符有四個 public private protected 預設 區域性變數...

靜態區域性變數

在區域性變數前加上 static 關鍵字,就成了靜態區域性變數。靜態區域性變數存放在記憶體的全域性資料區。函式結束時,靜態區域性變數不會消失,每次該函式呼叫時,也不會為其重新分配空間。它始終駐留在全域性資料區,直到程式執行結束。靜態區域性變數的初始化與全域性變數類似 如果不為其顯式初始化,則c 自動...