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 linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
Python深入学习之特殊方法与多范式
Aug 31 Python
利用python实现数据分析
Jan 11 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
python获取txt文件词向量过程详解
Jul 05 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
python 实现字符串下标的输出功能
Feb 13 Python
Django框架models使用group by详解
Mar 11 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
Python Selenium库的基本使用教程
Jan 04 Python
python中sys模块的介绍与实例
Apr 17 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
PHP与SQL注入攻击[一]
2007/04/17 PHP
php创建sprite
2014/02/11 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
js控制frameSet示例
2013/09/10 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
医学专业毕业生个人的求职信
2013/12/04 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
法务专员岗位职责
2015/02/14 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
趣味运动会标语口号
2015/12/26 职场文书