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之玩转字符串(2)
Sep 14 Python
介绍Python的Urllib库的一些高级用法
Apr 30 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
python设定并获取socket超时时间的方法
Jan 12 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
使用python实现简单五子棋游戏
Jun 18 Python
PyQt5 多窗口连接实例
Jun 19 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 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链表操作简单示例
2016/10/15 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
vue 动态创建组件的两种方法
2020/12/31 Vue.js
详解Python编程中包的概念与管理
2015/10/16 Python
python Django模板的使用方法
2016/01/14 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
python解析xml简单示例
2019/06/21 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
九年级物理教学反思
2014/01/29 职场文书
环保建议书400字
2014/05/14 职场文书
法学专业求职信
2014/07/15 职场文书
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python