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实现通过哈希算法检测图片重复的教程
Apr 02 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
Python自动抢红包教程详解
Jun 11 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 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实现的json类实例
2015/07/28 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php生成word并下载代码实例
2019/03/15 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
js 蒙版进度条(结合图片)
2010/03/10 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
如何利用Fabric自动化你的任务
2016/10/20 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
python实现抖音点赞功能
2019/04/07 Python
python实现邮件发送功能
2019/08/10 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
Python如何发送与接收大型数组
2020/08/07 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
预备党员入党思想汇报
2014/01/04 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
学生操行评语大全
2014/04/24 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python