关闭

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