關閉

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