舉個栗子:
作品,但這個程式碼:
導致UnboundLocalError:
這是因為,當您對作用域中的變數進行賦值時,該變數將變為該作用域的區域性變數,並在外部作用域中對任何具有相似名稱的變數進行遮蔽。由於foo中的最後一個語句賦予一個新值 ,因此編譯器將其識別為區域性變數。因此,當早期嘗試列印未初始化的區域性變數併產生錯誤時。
在上面的例子中,你可以透過宣告它是全域性的來訪問外部範圍變數:
這個顯式宣告是為了提醒你(不同於類和例項變數的表面上類似的情況),你實際上是在修改外部變數的值:
您可以使用 關鍵字在巢狀範圍內做類似的事情:
舉個栗子:
>>> x = 10>>> def bar():... print(x)>>> bar()10作品,但這個程式碼:
>>>>>> x = 10>>> def foo():... print(x)... x += 1導致UnboundLocalError:
>>>>>> foo()Traceback (most recent call last): ...UnboundLocalError: local variable "x" referenced before assignment這是因為,當您對作用域中的變數進行賦值時,該變數將變為該作用域的區域性變數,並在外部作用域中對任何具有相似名稱的變數進行遮蔽。由於foo中的最後一個語句賦予一個新值 ,因此編譯器將其識別為區域性變數。因此,當早期嘗試列印未初始化的區域性變數併產生錯誤時。
在上面的例子中,你可以透過宣告它是全域性的來訪問外部範圍變數:
>>>>>> x = 10>>> def foobar():... global x... print(x)... x += 1>>> foobar()10這個顯式宣告是為了提醒你(不同於類和例項變數的表面上類似的情況),你實際上是在修改外部變數的值:
>>>>>> print(x)11您可以使用 關鍵字在巢狀範圍內做類似的事情:
>>>>>> def foo():... x = 10... def bar():... nonlocal x... print(x)... x += 1... bar()... print(x)>>> foo()1011