第二十六章、闭包

1. 闭包(Closure)

什么是闭包

闭包是指一个函数(称为嵌套函数)引用了其外部函数作用域内的变量,并且该外部函数已经执行完毕(即其作用域理论上应该被销毁),但嵌套函数仍然可以访问这些变量。闭包的核心特点是“跨作用域引用”。

在本质上,闭包是将内部嵌套函数和函数外部的执行环境绑定在一起的对象。

闭包形成条件

闭包的三个必要条件:

  1. 一个函数内部定义了另一个函数。
  2. 嵌套函数内部引用了外部函数的变量。
  3. 外部函数返回嵌套函数(或将其传递到其他作用域)。

闭包示例

def make_power(y):
    def fn(x):
        return x ** y
    return fn

pow2 = make_power(2)
print("5的平方是:", pow2(5))

pow3 = make_power(3)
print("6的立方是:", pow3(6))

闭包的优缺点

优点

  1. 闭包可以替代全局变量,将数据隐藏在函数内部,避免污染全局命名空间。
  2. 闭包可以记住函数调用之间的状态,适用于需要记忆功能的场景。
  3. Python 的装饰器就是基于闭包实现的,可以动态增强函数功能。

缺点

  1. 闭包会长期持有外部变量,可能导致内存无法释放。
  2. 过度使用闭包可能导致代码难以理解,尤其是多层嵌套时。
  3. 闭包的变量隐藏在嵌套函数中,调试时可能难以追踪。