问题: 什么是闭包,闭包的核心构成条件有哪些?

👇 点击展开/折叠 面试背诵模板(建议先背这个) 闭包是指在一个外层函数中定义了内层函数,内层函数引用了外层函数的局部变量,并且外层函数将内层函数作为返回值返回。核心构成条件有三个:必须有一个嵌套函数(内层函数定义在外层函数内部);内层函数必须引用外层函数的局部变量(自由变量);外层函数必须将内层函数作为返回值返回。闭包让内层函数在其定义环境(外层函数执行完毕)消失后,仍然能记住并访问被引用的外层变量,实现数据持久化和私有状态保持。
---

闭包的工作机制

当外层函数执行完毕并返回内层函数时,外层函数的局部变量本应被回收,但由于内层函数持有对它们的引用,Python 会将这部分变量连同内层函数一起打包成一个“闭包单元”,存入内层函数的 __closure__ 属性中。此后每次调用内层函数,都能访问到这些“冻结”的环境变量。

核心代码示例

1
2
3
4
5
6
7
def outer(x):
def inner(y):
return x + y # inner 引用了外层变量 x
return inner # 返回内层函数

add_5 = outer(5)
print(add_5(3)) # 输出 8,闭包保留了 x=5

闭包 vs 普通嵌套函数对比

维度 普通嵌套函数 闭包
引用外层变量 可能引用,但外部无法持有 内层函数被返回并持有引用
外层执行后变量状态 全部释放 被内层函数保留(cell 对象)
后续调用可访问外层变量 否 是

闭包的应用场景

  • 装饰器(最常用):利用闭包保存被装饰函数和配置参数。
  • 工厂函数:根据不同参数生成不同行为的函数(如 make_power(2) 生成平方函数)。
  • 数据隐藏 / 私有状态:通过闭包模拟私有变量,避免全局暴露。