python UnboundLocalError: local variable 'xxx' referenced before assignment
大意就是在變量定義前就引用了變量。
錯誤代碼如下:
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())