關閉
Python 中的閉包是由函式呼叫建立的。在這裡,對 makeInc
的呼叫為 x
建立了一個繫結,該繫結在函式 inc
中引用。每次呼叫 makeInc
都會建立此函式的新例項,但每個例項都有一個指向 x
的不同繫結的連結。
def makeInc(x):
def inc(y):
# x is "attached" in the definition of inc
return y + x
return inc
incOne = makeInc(1)
incFive = makeInc(5)
incOne(5) # returns 6
incFive(5) # returns 10
請注意,在常規閉包中,封閉函式完全從其封閉環境繼承所有變數,在此構造中,封閉函式只具有對繼承變數的讀訪問許可權,但不能對它們進行賦值
def makeInc(x):
def inc(y):
# incrementing x is not allowed
x += y
return x
return inc
incOne = makeInc(1)
incOne(5) # UnboundLocalError: local variable 'x' referenced before assignment
Python 3 提供了 nonlocal
語句(Nonlocal Variables ),用於實現巢狀函式的完全閉包。
Python 3.x >= 3.0
def makeInc(x):
def inc(y):
nonlocal x
# now assigning a value to x is allowed
x += y
return x
return inc
incOne = makeInc(1)
incOne(5) # returns 6