闭包(Closure)指的是一个函数,这个函数捕获了定义时在其外部作用域中的一些变量。 实现闭包的通常方法是在一个函数 A 里面定义另一个函数 B,在函数 B 中可以对函数 A 的局部变量进行访问(词法作用域)。

使用闭包的目的一般有:

  • 创建数据隐藏和封装实例:类似于 OOP 中的对象和方法
  • 创建工厂函数:生成配置不同的函数
  • 延迟计算:延迟执行某些操作

下面的例子展示了如何使用闭包维护一个局部变量的状态:

def make_counter():
    count = 0
    def counter():
        nonlocal count  # 声明 count 是外部函数的局部变量
        count += 1
        return count
    return counter
 
# 局部定义函数在它们返回时仍旧持有所关联的环境 (count)
my_counter = make_counter()
 
# 调用闭包函数
print(my_counter())  # 输出 1
print(my_counter())  # 输出 2
print(my_counter())  # 输出 3