1. 程式人生 > >[轉]nonlocal和global

[轉]nonlocal和global

foo 聲明 並不是 AS IV lock leg pre local

在Python中,當引用一個變量的時候,對這個變量的搜索是按找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、內置作用域(builtins模塊)的順序來進行的,即所謂的LEGB規則。
然而當在一個函數內部為一個變量賦值時,並不是按照上面所說LEGB規則來首先找到變量,之後為該變量賦值。在Python中,在函數中為一個變量賦值時,有下面這樣一條規則:

當在函數中給一個變量名賦值是(而不是在一個表達式中對其進行引用),Python總是創建或改變本地作用域的變量名,除非它已經在那個函數中被聲明為全局變量.

global的使用場景

x = 99
def func()
    global x
    x = 88
func()
print(x)    #輸出88

nonlocal的使用場景

def func():
    count = 1
    def foo():
        nonlocal count
        count = 12
    foo()
    print(count)
func()     #輸出12

[轉]nonlocal和global