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中from module import * 的一个坑
Jul 20 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
Python 内置函数complex详解
Oct 23 Python
python保存网页图片到本地的方法
Jul 24 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
Python参数类型以及常见的坑详解
Jul 08 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
什么是python的id函数
Jun 11 Python
python代码区分大小写吗
Jun 17 Python
python爬虫基础之urllib的使用
Dec 31 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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 session处理的定制
2009/03/16 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
brook javascript框架介绍
2011/10/10 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
vue中如何使用ztree
2018/02/06 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
Python 返回汉字的汉语拼音
2009/02/27 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
应届毕业生就业自荐信
2013/10/26 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
党员自我评价分享
2013/12/13 职场文书
50岁生日感言
2014/01/23 职场文书
2014年母亲节寄语
2014/05/07 职场文书
战略合作意向书
2014/07/29 职场文书
大学生党性分析材料
2014/12/19 职场文书
责任书范本大全
2015/05/11 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
高中语文教学反思范文
2016/02/16 职场文书
python 实现德洛内三角剖分的操作
2021/04/22 Python