python UnboundLocalError: local variable 'xxx' referenced before assignment
阿新 • • 發佈:2018-11-10
大意就是在變數定義前就引用了變數。
錯誤程式碼如下:
def f():
print(n)
n = 10
f()
這裡還是很清楚,很明白。
然而下面的程式碼就令人有些頭疼:
n = 100
def f():
print(n)
n = 10
f()
雖然定義了變數n,然後在函式內部修改,但是還是報相同的錯誤。原因在於在函式內部對變數n進行修改後,變數n被python直譯器理解為區域性變數,就變成和上面程式碼一樣的情況了。
def f():
print(n)
f()
此時由於沒有定義變數n,所以報NameError: name ‘n’ is not defined
注意:
一般情況下,在訪問變數時,會先查詢本地變數,然後是包裹此函式的外部函式內的變數,之後是全域性變數,最後是內建作用域的變數,即:L->E->G->B(E不一定存在)。在預設情況下,變數名賦值會在當前作用域建立變數和修改變數。
作用域 | 英文解釋 | 英文簡寫 |
---|---|---|
區域性作用域(函式內) | Local(function) | L |
外部巢狀函式作用域 | Enclosing function locals | E |
函式定義所在模組作用域 | Global(module) | G |
python內建模組的作用域 | Bui | B |
示例如下:
v = 100 # 全域性作用域
def fun1():
v = 200 # 外部巢狀函式作用域
print('fun1.v=', v)
print(locals())
def fun2():
v = 300 # 區域性作用域
print('fun2.v=', v)
print(max) # max函式都沒有建立,在內建函式作用域中,只讀,不能改變 # 可以在其餘三個作用域重新建立。
print(locals())
fun2()
fun1()
print("全域性變數.v=", v)
print(max) # max變數定義在內建模組的作用域,是解釋執行器提前定義好的
print(locals())