Python中的延迟绑定原理详解


Posted in Python onOctober 11, 2019

直接看下面例子

my_ld = [lambda x:x*i for i in range(3)]
my_list = [ld(2) for ld in my_ld]
print(my_list)

本想是想通过以上代码,输出[0, 2, 4]的,但结果却是[4, 4, 4]

下面说下本人对这个结果的理解:

因为Python解释器,遇到lambda(或者def),只是定义了一个匿名函数对象,并保存在内存中,只有等到调用这个匿名函数的时候,才会执行函数内部的代码(x*i)。所以匿名函数中的i并不是立即引用后面循环中的i值的,而是在调用嵌套函数的时候,才会查找i的值,这个特性也就是延迟绑定。

而 for i in range(3) 是另外一个表达式,Python解释器解释到就会直接执行,代码执行到ld(2)时,循环已经结束了,此时的i指向2 ,my_ld为包含了三个匿名函数对象的列表,所以打印my_list的结果是[4, 4, 4]。

如果我们要输出[0, 2, 4], 可以给lambda表达式多加一个缺省参数a=i,代码如下:

my_ld = [lambda x, a=i:x*a for i in range(3)]
my_list = [ld(2) for ld in my_ld]
print(my_list)

Python函数中的缺省参数,是在Python解释器遇到lambda a=i (或者def(a=i))时,就必须初始化默认值,此时 每循环一次,缺省参数a就需要找一次i的引用。i=0时,第一个匿名函数的默认参数值就是0,i=1时,第二个匿名函数的默认参数值就是1,以此类推。所以当代码执行到ld(2)时,每个匿名函数中a的默认值都不一样。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 Python
使用Python抓取模板之家的CSS模板
Mar 16 Python
python中引用与复制用法实例分析
Jun 04 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
简单了解Django应用app及分布式路由
Jul 24 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
python库sklearn常用操作
Aug 23 Python
python代码实现扫码关注公众号登录的实战
Nov 01 Python
python pycharm的安装及其使用
Oct 11 #Python
详解Python3迁移接口变化采坑记
Oct 11 #Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 #Python
Pycharm 2019 破解激活方法图文详解
Oct 11 #Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 #Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 #Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 #Python
You might like
utf8的编码算法 转载
2006/12/27 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
vue input标签通用指令校验的实现
2019/11/05 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
TensorFlow打印输出tensor的值
2020/04/19 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
音乐教学案例
2014/01/30 职场文书
简历里的自我评价
2014/01/31 职场文书
进口业务员岗位职责
2014/04/06 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
升学宴学生致辞
2015/07/27 职场文书