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自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
快速了解python leveldb
Jan 18 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
python 多个参数不为空校验方法
Feb 14 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
Django之路由层的实现
Sep 09 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
Python xlrd模块导入过程及常用操作
Jun 10 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中strtotime函数使用方法分享
2012/01/10 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
Python Nose框架编写测试用例方法
2017/10/26 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
python爬虫增加访问量的方法
2019/08/22 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
keras得到每层的系数方式
2020/06/15 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
小区的门卫岗位职责
2014/10/01 职场文书
家长高考寄语
2015/02/27 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
2019教师的学习计划
2019/06/25 职场文书
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技