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实现的异步代理爬虫及代理池
Mar 17 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
tensorflow中next_batch的具体使用
Feb 02 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
python实现数据分析与建模
Jul 11 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
利用python计算时间差(返回天数)
Sep 07 Python
Python中的四种交换数值的方法解析
Nov 18 Python
python取均匀不重复的随机数方式
Nov 27 Python
Python爬虫之Selenium库的使用方法
Jan 03 Python
jupyter notebook更换皮肤主题的实现
Jan 07 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中的日期及时间
2006/11/23 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php支付宝APP支付功能
2020/07/29 PHP
xss文件页面内容读取(解决)
2010/11/28 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python生成随机密码的方法
2017/06/16 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
详解python中递归函数
2019/04/16 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
几道PHP的面试题
2012/05/19 面试题
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
户籍证明的格式
2014/01/13 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
诚信考试倡议书
2014/04/15 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
裁员通知
2015/04/25 职场文书