闭包是函数携带其定义时环境的现象,满足嵌套函数、引用外部非全局变量并返回内部函数三个条件。如outer(5)返回的inner能访问x=5,实现私有状态封装;循环中需绑定变量避免共享同一引用,常用默认参数或嵌套函数解决。

掌握 Python 中的闭包,关键在于理解函数如何携带其定义时的环境,并在后续调用中访问外部作用域的变量。闭包不是某种特殊语法,而是一种现象或模式,常见于嵌套函数中。
什么是闭包?
当一个内部函数引用了其外部函数中的变量,并且这个内部函数被返回或传递到外部作用域时,就形成了闭包。该内部函数“记住”了它创建时的环境,即使外部函数已经执行完毕,那些变量依然存在并可被访问。
简单例子:
def outer(x):def inner(y):
return x + y
return inner
add5 = outer(5)
print(add5(3)) # 输出 8
这里 inner 函数使用了外部函数 outer 的参数 x,即使 outer 执行结束,x 仍然保留在 add5 所指向的函数中。这就是闭包的作用。
立即学习“Python免费学习笔记(深入)”;
闭包的三个条件
要形成闭包,必须满足以下三点:
- 存在嵌套函数(函数内部定义另一个函数)
- 内部函数引用了外部函数的非全局变量
- 外部函数将内部函数作为返回值返回
只要这三个条件都满足,Python 就会自动创建闭包,保留外部变量的状态。
实际应用场景
闭包常用于实现数据封装、延迟计算和装饰器等高级功能。
比如创建一个计数器:
def make_counter():count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter = make_counter()
print(counter()) # 1
print(counter()) # 2
这里的 count 变量对外部不可见,只能通过返回的函数操作,实现了简单的私有状态封装。nonlocal 关键字允许修改外部作用域的变量,是处理可变状态的关键。
注意变量绑定问题
初学者容易在循环中误用闭包:
funcs = []for i in range(3):
def f():
return i
funcs.append(f)
for f in funcs:
print(f()) # 预期 0,1,2?实际输出 2,2,2
因为所有函数都引用同一个变量 i,循环结束后 i=2,所以每个函数都返回 2。解决方法是绑定当前值:
funcs = []for i in range(3):
def make_f(x):
def f():
return x
return f
funcs.append(make_f(i))
或者使用默认参数:
def f(i=i):return i
基本上就这些。理解闭包的核心是搞清作用域和生命周期的关系,多写几个小例子,观察变量如何被保留,就能自然掌握。











