当前位置:首页>python>为什么Python要设计"闭包"?面试官一句追问,80%的人当场沉默了……

为什么Python要设计"闭包"?面试官一句追问,80%的人当场沉默了……

  • 2026-09-08 02:56:49
为什么Python要设计"闭包"?面试官一句追问,80%的人当场沉默了……

"什么是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())

输出:

123

很多人第一次看到都会疑惑。

等等……

counter()不是早就执行结束了吗?

为什么count还存在?

答案就在两个字:

闭包。

内部函数add一直引用着count。

所以,

Python不会立即释放这块内存。


🤔 面试官最喜欢追问

为什么一定要用nonlocal?

这是很多人都会踩坑的地方。

如果写成:

count += 1

Python会认为:

这是一个新的局部变量。

于是直接报错。

为什么?

因为Python遵循LEGB作用域规则:

  • Local(局部)
  • Enclosing(闭包作用域)
  • Global(全局)
  • Built-in(内置)

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())

很多人认为输出:

012

其实真正结果却是:

222

为什么?

因为:

闭包保存的是变量。

不是变量当时的值。

循环结束后,

i

已经变成2。

所有函数引用的,

都是同一个变量。

正确写法:

funcs.append(lambda i=i: i)

或者:

使用默认参数保存当前值。

这一点,

几乎每年都会出现在大厂笔试里。


💡 我的观点

很多人学Python,

总喜欢问:

闭包有什么用?

其实,

这个问题本身就问错了。

真正应该问的是:

为什么Python要让函数拥有状态?

因为现代软件开发,

越来越强调:

封装。

复用。

解耦。

如果所有状态都放全局变量,

代码一定越来越乱。

如果全部放类里面,

很多简单问题反而复杂了。

于是,

Python给了我们第三种选择。

函数,

也可以拥有自己的状态。

这就是闭包。

AI时代更是如此。

AI可以帮你生成几十行代码。

却不会告诉你:

什么时候适合闭包?

什么时候应该用类?

什么时候应该改成对象设计?

真正值钱的,

永远不是语法。

而是判断。


📚 今日知识总结

✅ 闭包本质是:内部函数引用了外部变量,并持续保存该变量。

✅ nonlocal用于修改外层函数变量,而不是创建新的局部变量。

✅ 装饰器底层大量依赖闭包实现。

✅ FastAPI、Flask、LangChain等框架都广泛使用闭包思想。

✅ 面试官真正考察的,不是定义,而是你是否理解Python的设计哲学。


💬 今日思考

如果面试官继续追问:

闭包和类(Class)都可以保存状态,它们有什么区别?实际开发中应该如何选择?

这道题,很多五年以上的开发者都未必能答完整。

欢迎留言分享你的理解。👇

关注我,每天拆解一道Python大厂高频面试题,不背八股,只讲原理;不止告诉你怎么写,更告诉你为什么这样设计。真正的竞争力,从来都不是代码,而是思考。 🐍🚀

最新文章

随机文章