Python闭包需满足三条件:函数嵌套、内部函数引用外部局部变量、外部函数返回内部函数对象;它可封装状态、实现装饰器等,但需注意延迟绑定陷阱。
Python闭包的核心在于:内部函数引用了外部函数的局部变量,并且外部函数返回了这个内部函数。它让函数能“记住”自己被定义时的环境,实现轻量级的状态封装。
一个函数要构成闭包,必须同时满足三个条件:
例如:
def make_adder(n):
def add(x):
return x + n # 引用了外部变量 n
return add # 返回函数,不是 add(x)
plus_5 = make_adder(5)
print(plus_5(3)) # 输出 8
当只需要维护少量、单一维度的状态(比如计数器、偏移量、配置参数),闭包比定义类更简洁直观。
比如实现一个自增计数器:
def counter():
count = 0
def inc():
nonlocal count
count += 1
return count
return inc

c = counter()
print(c()) # 1
print(c()) # 2
这里 nonlocal 是关键——它告诉 Python,count 不是局部变量,而是外层函数的变量,允许内部函数修改它。
初学者容易遇到的问题:多个闭包共享同一个外部变量,而该变量在循环中被反复赋值,导致所有闭包最终“记住”的是最后一次值。
错误写法:
funcs = []
for i in range(3):
funcs.append(lambda: i) # 全部引用同一个 i
print([f() for f in funcs]) # [2, 2, 2]修复方式:用默认参数立即绑定当前值:
funcs = []
for i in range(3):
funcs.append(lambda x=i: x) # x=i 在定义时就固定了 i 的当前值
print([f() for f in funcs]) # [0, 1, 2]或改用闭包函数封装:
def make_func(x):
return lambda: x
funcs = [make_func(i) for i in range(3)]装饰器本质就是闭包。比如写一个带参数的重试装饰器:
def retry(max_attempts=3):
def decorator(func):
def wrapper(*args, **kwargs):
for i in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception:
if i == max_attempts - 1:
raise
return None
return wrapper
return decorator
@retry(max_attempts=2)
def fetch_data():
模拟可能失败的操作
pass
这里的 retry 接收配置,返回装饰器函数;装饰器再接收目标函数,返回包装后的函数——三层嵌套,典型闭包链,每一层都保持了上一层的参数状态。
相关文章:
建站之星2.7模板:企业网站建设与h5定制设计专题
清除minerd进程的简单方法
如何用5美元大硬盘VPS安全高效搭建个人网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
大型企业网站制作流程,做网站需要注册公司吗?
如何快速搭建高效WAP手机网站?
如何高效完成独享虚拟主机建站?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
建站之星导航如何优化提升用户体验?
小型网站制作HTML,*游戏网站怎么搭建?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
北京网站制作网页,网站升级改版需要多久?
建站上市公司网站建设方案与SEO优化服务定制指南
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
定制建站哪家更专业可靠?推荐榜单揭晓
智能起名网站制作软件有哪些,制作logo的软件?
西安大型网站制作公司,西安招聘网站最好的是哪个?
如何在云服务器上快速搭建个人网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
c# 服务器GC和工作站GC的区别和设置
建站之星上传入口如何快速找到?
如何在云指建站中生成FTP站点?
如何用西部建站助手快速创建专业网站?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
如何快速搭建自助建站会员专属系统?
网站制作说明怎么写,简述网页设计的流程并说明原因?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
如何快速辨别茅台真假?关键步骤解析
如何通过老薛主机一键快速建站?
南京网站制作费用,南京远驱官方网站?
制作网站公司那家好,网络公司是做什么的?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何通过山东自助建站平台快速注册域名?
大连网站制作公司哪家好一点,大连买房网站哪个好?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星CMS五站合一模板配置与SEO优化指南
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
建站VPS配置与SEO优化指南:关键词排名提升策略
宝塔建站教程:一键部署配置流程与SEO优化实战指南
建站主机系统SEO优化与智能配置核心关键词操作指南
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星安装后如何自定义网站颜色与字体?
建站主机如何安装配置?新手必看操作指南
如何设置并定期更换建站之星安全管理员密码?
建站之星logo尺寸如何设置最合适?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
宝塔面板创建网站无法访问?如何快速排查修复?
*请认真填写需求信息,我们会在24小时内与您取得联系。