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 11 Python
SQLite3中文编码 Python的实现
Jan 11 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
python获取交互式ssh shell的方法
Feb 14 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python3 反射的四种基本方法解析
Aug 26 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
python构造IP报文实例
May 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中英混合字符串截取函数代码
2011/07/17 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
JS解析XML的实现代码
2009/11/12 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python中除法使用的注意事项
2014/08/21 Python
Cpy和Python的效率对比
2015/03/20 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
python实现名片管理系统
2018/11/29 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
python做反被爬保护的方法
2019/07/01 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
法人代表委托书
2014/04/04 职场文书
医学专业自荐信
2014/06/14 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
水知道答案观后感
2015/06/08 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
HTTP中的Content-type详解
2022/01/18 HTML / CSS