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 装饰器功能以及函数参数使用介绍
Jan 27 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
python爬虫超时的处理的实例
Dec 19 Python
python使用suds调用webservice接口的方法
Jan 03 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
python调用webservice接口的实现
Jul 12 Python
使用django实现一个代码发布系统
Jul 18 Python
python内置模块collections知识点总结
Dec 19 Python
python实现银行实战系统
Feb 26 Python
Python如何给你的程序做性能测试
Jul 29 Python
opencv深入浅出了解机器学习和深度学习
Mar 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数据库操作方法(MYSQL版)
2011/06/08 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
JS实现购物车基本功能
2020/11/08 Javascript
Python算法应用实战之栈详解
2017/02/04 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
大学生自荐书范文
2013/12/10 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
绵山导游词
2015/02/05 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS