1. 程式人生 > >python UnboundLocalError: local variable 'xxx' referenced before assignment

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())