
Python闭包是指一个函数对象,它不仅包含函数本身,还“记住”了其定义时所在的作用域中的变量(即使外部函数已经执行完毕)。简单说:闭包 = 函数 + 它能访问的非全局自由变量。
闭包的三个必要条件
要构成闭包,必须同时满足:
- 存在一个嵌套函数(内部函数定义在另一个函数内部)
- 内部函数引用了外部函数的局部变量(非全局,也非参数传入)
- 外部函数返回了内部函数(注意:是函数对象本身,不是调用结果,即不带括号)
闭包如何保存外部变量的值
Python 在创建内部函数对象时,会自动将其引用的外部变量打包进函数的 __closure__ 属性中。每个变量对应一个 cell 对象,里面存着实际值。
例如:
立即学习“Python免费学习笔记(深入)”;
def make_adder(n):def add(x):
return x + n # n 是自由变量
return add
add5 = make_adder(5)
print(add5.__closure__) #
print(add5.__closure__[0].cell_contents) # 输出 5
闭包与普通嵌套函数的区别
关键看变量是否“被记住”:
- 如果内部函数没引用外部局部变量 → 不是闭包(只是普通嵌套)
- 如果引用了但外部函数没返回它 → 也不是闭包(生命周期结束,变量通常被释放)
- 只有返回后还能通过该函数持续访问那些变量 → 才是真正的闭包
闭包让变量“活”过了外部函数的调用周期,实现了数据的封装和延迟绑定。
闭包的典型用途
闭包常用于需要“预设配置”或“状态轻量携带”的场景:
- 生成带默认参数的函数(如上面的 add5、add10)
- 实现装饰器(装饰器函数返回内层包装函数,常依赖外层参数)
- 回调函数中捕获当前上下文(比如 GUI 或异步编程中)
- 替代简单类:当只需保存少量状态+一个行为时,闭包比定义类更简洁










