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编写脚本获取手机当前应用apk的信息
Jul 21 Python
用pickle存储Python的原生对象方法
Apr 28 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Python实现调度算法代码详解
Dec 01 Python
详细分析python3的reduce函数
Dec 05 Python
python解析json串与正则匹配对比方法
Dec 20 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
python制作英语翻译小工具代码实例
Sep 09 Python
对python中assert、isinstance的用法详解
Nov 27 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
利用PyTorch实现VGG16教程
Jun 24 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
是否存在第一台收音机的说法
2021/03/01 无线电
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
修复IE9&safari 的sort方法
2011/10/21 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
windows下python和pip安装教程
2018/05/25 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
谈谈python垃圾回收机制
2020/09/27 Python
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
英国工具中心:UK Tool Centre
2017/07/10 全球购物
好习惯伴我成长演讲稿
2014/05/21 职场文书
学校个人对照检查材料
2014/08/26 职场文书
劳模事迹材料范文
2014/12/24 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
工作简历的自我评价
2019/05/16 职场文书
python套接字socket通信
2022/04/01 Python