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之wxPython菜单使用详解
Sep 28 Python
python实现每次处理一个字符的三种方法
Oct 09 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
python先序遍历二叉树问题
Nov 10 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
python实现多线程端口扫描
Aug 31 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
基于TensorBoard中graph模块图结构分析
Feb 15 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使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php实现httpRequest的方法
2015/03/13 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
javascript显示隐藏层比较不错的方法分析
2008/09/30 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python 递归函数详解及实例
2016/12/27 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
Python实现随机漫步功能
2018/07/09 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
优秀员工表扬信
2014/01/17 职场文书
应届大专生求职信
2014/06/26 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书