"什么是Python闭包(Closure)?"
最近刷牛客网,我发现这道题又冲上了Python面试高频榜。
阿里、美团、字节跳动、百度、微软、Oracle、Google……几乎每年都会考。
很多人看到这道题,第一反应就是:
"闭包?是不是和装饰器有关?"
回答没错。
但如果仅仅停留在这里,基本拿不到高分。
因为真正优秀的Python工程师,理解的是为什么需要闭包,而不是只会背定义。
今天,我们就把这个知识点彻底讲透。👇
📌 今日面试题
什么是闭包?闭包解决了什么问题?
标准答案通常是:
内部函数引用了外部函数的变量,并且外部函数已经执行结束,这个内部函数就是闭包。
是不是有点绕?
别急。
我们换一种方式理解。
一个生活里的例子
假设你开了一家咖啡店。
今天来了很多顾客。
每位顾客都有自己的会员积分。
如果每次查询积分,都要重新去数据库查一次。
是不是很慢?
于是,你想到一种办法。
顾客办理会员的时候,
系统就把他的积分"记住"。
以后查询,
直接从内存里拿。
这就是:
状态保存。
而闭包,
就是Python保存状态的一种方式。
看一段代码
def counter(): count = 0 def add(): nonlocal count count += 1 return count return add
然后:
c = counter()print(c())print(c())print(c())
输出:
很多人第一次看到都会疑惑。
等等……
counter()不是早就执行结束了吗?
为什么count还存在?
答案就在两个字:
闭包。
内部函数add一直引用着count。
所以,
Python不会立即释放这块内存。
🤔 面试官最喜欢追问
为什么一定要用nonlocal?
这是很多人都会踩坑的地方。
如果写成:
Python会认为:
这是一个新的局部变量。
于是直接报错。
为什么?
因为Python遵循LEGB作用域规则:
count属于外层函数。
不是当前函数。
所以,
必须告诉解释器:
我要修改外层变量,而不是重新创建一个。
这就是nonlocal存在的意义。
🚀 为什么装饰器离不开闭包?
很多人学装饰器的时候,
总觉得:
为什么里面一定要再套一个函数?
原因其实很简单。
来看:
def logger(func): def wrapper(*args, **kwargs): print(”开始执行”) return func(*args, **kwargs) return wrapper
这里:
wrapper
一直保存着:
func
即使:
logger()
已经执行结束。
为什么还能调用?
因为:
闭包把func保存下来了。
所以,
可以这样说:
没有闭包,就没有今天Python优雅的Decorator。
AI时代,一个你每天都在用的闭包
很多人不知道。
你每天使用的很多AI框架,
其实都大量依赖闭包。
例如:
FastAPI。
Flask。
LangChain。
甚至不少Agent框架。
为什么?
因为:
它们需要:
记录配置。
保存上下文。
缓存状态。
管理请求。
这些,
本质上都是:
让函数拥有"记忆能力"。
闭包,
正是实现方式之一。
所以,
它不是一道面试题。
而是一种设计思想。
一个很多人不知道的小坑
来看牛客上一道经典题。
funcs = []for i in range(3): def f(): return i funcs.append(f)for func in funcs: print(func())
很多人认为输出:
其实真正结果却是:
为什么?
因为:
闭包保存的是变量。
不是变量当时的值。
循环结束后,
i
已经变成2。
所有函数引用的,
都是同一个变量。
正确写法:
funcs.append(lambda i=i: i)
或者:
使用默认参数保存当前值。
这一点,
几乎每年都会出现在大厂笔试里。
💡 我的观点
很多人学Python,
总喜欢问:
闭包有什么用?
其实,
这个问题本身就问错了。
真正应该问的是:
为什么Python要让函数拥有状态?
因为现代软件开发,
越来越强调:
封装。
复用。
解耦。
如果所有状态都放全局变量,
代码一定越来越乱。
如果全部放类里面,
很多简单问题反而复杂了。
于是,
Python给了我们第三种选择。
函数,
也可以拥有自己的状态。
这就是闭包。
AI时代更是如此。
AI可以帮你生成几十行代码。
却不会告诉你:
什么时候适合闭包?
什么时候应该用类?
什么时候应该改成对象设计?
真正值钱的,
永远不是语法。
而是判断。
📚 今日知识总结
✅ 闭包本质是:内部函数引用了外部变量,并持续保存该变量。
✅ nonlocal用于修改外层函数变量,而不是创建新的局部变量。
✅ 装饰器底层大量依赖闭包实现。
✅ FastAPI、Flask、LangChain等框架都广泛使用闭包思想。
✅ 面试官真正考察的,不是定义,而是你是否理解Python的设计哲学。
💬 今日思考
如果面试官继续追问:
闭包和类(Class)都可以保存状态,它们有什么区别?实际开发中应该如何选择?
这道题,很多五年以上的开发者都未必能答完整。
欢迎留言分享你的理解。👇
关注我,每天拆解一道Python大厂高频面试题,不背八股,只讲原理;不止告诉你怎么写,更告诉你为什么这样设计。真正的竞争力,从来都不是代码,而是思考。 🐍🚀