什么是闭包?

简单说,闭包就是根据不同的配置信息得到不同的结果。
再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
延迟绑定
Python闭包函数所引用的外部自由变量是延迟绑定的。
Python
In [2]: def multipliers(): ...: return [lambda x: i * x for i in range(4)] In [3]: print [m(2) for m in multipliers()] [6, 6, 6, 6] In [2]: def multipliers(): ...: return [lambda x: i * x for i in range(4)] In [3]: print [m(2) for m in multipliers()] [6, 6, 6, 6]
如以上代码: i是闭包函数引用的外部作用域的自由变量, 只有在内部函数被调用的时候才会搜索变量i的值, 由于循环已结束, i指向最终值3, 所以各函数调用都得到了相同的结果。
解决方法:
1) 生成闭包函数的时候立即绑定(使用函数形参的默认值):
Python
In [5]: def multipliers():
return [lambda x, i=i: i* x for i in range(4)]
...:
In [6]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
In [5]: def multipliers():
return [lambda x, i=i: i* x for i in range(4)]
...:
In [6]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
如以上代码: 生成闭包函数的时候, 可以看到每个闭包函数都有一个带默认值的参数: i=i, 此时, 解释器会查找i的值, 并将其赋予形参i, 这样在生成闭包函数的外部作用域(即外部循环中), 找到了变量i, 遂将其当前值赋予形参i。
2) 使用functools.partial:
Python
In [26]: def multipliers(): return [functools.partial(lambda i, x: x * i, i) for i in range(4)] ....: In [27]: print [m(2) for m in multipliers()] [0, 2, 4, 6] In [26]: def multipliers(): return [functools.partial(lambda i, x: x * i, i) for i in range(4)] ....: In [27]: print [m(2) for m in multipliers()] [0, 2, 4, 6]
如以上代码: 在有可能因为延迟绑定而出问题的时候, 可以通过functools.partial构造偏函数, 使得自由变量优先绑定到闭包函数上。
禁止在闭包函数内对引用的自由变量进行重新绑定
Python
def foo(func):
free_value = 8
def _wrapper(*args, **kwargs):
old_free_value = free_value #保存旧的free_value
free_value = old_free_value * 2 #模拟产生新的free_value
func(*args, **kwargs)
free_value = old_free_value
return _wrapper
def foo(func):
free_value = 8
def _wrapper(*args, **kwargs):
old_free_value = free_value #保存旧的free_value
free_value = old_free_value * 2 #模拟产生新的free_value
func(*args, **kwargs)
free_value = old_free_value
return _wrapper
以上代码会报错, UnboundLocalError: local variable 'free_value' referenced before assignment, 以上代码本意是打算实现一个带有某个初始化状态(free_value)但在执行内部闭包函数的时候又可以按需变化出新的状态(free_value = old_free_value * 2)的装饰器, 但内部由于发生了重新绑定, 解释器会将free_value看作局部变量, old_free_value = free_value则会报错, 因为解释器认为free_value是没有赋值就被引用了。
解决:
打算修改闭包函数引用的自由变量时, 可以将其放入一个list, 这样, free_value = [8], free_value不可修改, 但free_value[0]是可以安全的被修改的。
另外, Python 3.x增加了nonlocal关键字, 也可以解决这个问题。
以上所述是小编给大家介绍的Python闭包的两个注意事项,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# python
# 闭包
# Python 闭包的使用方法
# Python闭包函数定义与用法分析
# Python中的闭包总结
# Python闭包思想与用法浅析
# python中的闭包函数
# Python中的闭包实例详解
# 浅谈Python中的闭包
# Python闭包执行时值的传递方式实例分析
# 对Python闭包与延迟绑定的方法详解
# 绑定
# 将其
# 报错
# 小编
# 默认值
# 也不
# 都有
# 有可能
# 在此
# 是由
# 才会
# 但在
# 可以通过
# 而成
# 给大家
# 再来
# 可以看到
# 而出
# 都得
# 会将
相关文章:
音乐网站服务器如何优化API响应速度?
个人网站制作流程图片大全,个人网站如何注销?
如何在景安服务器上快速搭建个人网站?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
公司网站的制作公司,企业网站制作基本流程有哪些?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
建站之星收费标准详解:套餐费用及年费价格表一览
,巨量百应是干嘛的?
如何在Windows环境下新建FTP站点并设置权限?
建站主机CVM配置优化、SEO策略与性能提升指南
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何选择域名并搭建高效网站?
建站主机选哪家性价比最高?
如何通过多用户协作模板快速搭建高效企业网站?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
建站之星各版本价格是多少?
大连网站制作公司哪家好一点,大连买房网站哪个好?
建站主机如何选?高性价比方案全解析
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
香港服务器网站卡顿?如何解决网络延迟与负载问题?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
建站主机服务器选购指南:轻量应用与VPS配置解析
建站之星展会模版如何一键下载生成?
深圳网站制作培训,深圳哪些招聘网站比较好?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
如何在宝塔面板中创建新站点?
如何彻底卸载建站之星软件?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
建站之星云端配置指南:模板选择与SEO优化一键生成
实现虚拟支付需哪些建站技术支撑?
电商网站制作价格怎么算,网上拍卖流程以及规则?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Swift中swift中的switch 语句
黑客入侵网站服务器的常见手法有哪些?
如何解决VPS建站LNMP环境配置常见问题?
香港网站服务器数量如何影响SEO优化效果?
建站之星免费版是否永久可用?
C++如何编写函数模板?(泛型编程入门)
如何在阿里云ECS服务器部署织梦CMS网站?
为什么Go需要go mod文件_Go go mod文件作用说明
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
北京网站制作公司哪家好一点,北京租房网站有哪些?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星后台管理系统如何操作?
如何用腾讯建站主机快速创建免费网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。