在Python中,闭包(closure)是一个"记住"外部变量值的函数,即使在其作用域之外被调用。闭包是在内部函数引用外部函数中定义的变量时创建的。为了在Python 3中从嵌套函数修改这些变量,可以使用关键字nonlocal。
示例:
def make_accumulator(): total = 0 def add(value): nonlocal total total += value return total return add acc = make_accumulator() print(acc(10)) # 10 print(acc(5)) # 15
如果没有nonlocal,变量total将无法被修改(错误UnboundLocalError)。
问题: "可以在嵌套函数中不使用关键字nonlocal来增加外部函数中的变量吗?"
答案: 不可以,没有nonlocal会导致错误,因为解释器会认为该变量是嵌套函数的局部变量。示例:
def outer(): count = 0 def inner(): count += 1 # 错误UnboundLocalError return count return inner
故事 在一个Web应用程序中,想要通过嵌套函数为每个处理程序实现一个本地计数器,但忘记使用
nonlocal。计数器总是返回1,因为它在局部范围内计算count,并增加一个与外部闭包无关的新值。
故事 在并行处理(多线程)任务中,常常使用闭包和Lambda。如果不了解闭包的原理,就会出现所有Lambda函数"记住"循环变量的最后一个值的情况,任务互相复制,而不是处理不同的任务。
故事 在编写装饰器时,由于未使用正确的闭包(未将参数传递给外部作用域),出现了一种情况,使得装饰器无法在调用之间保持状态,从而导致意外结果和应用程序的不稳定工作。