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 + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
SVM基本概念及Python实现代码
Dec 27 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
python后端接收前端回传的文件方法
Jan 02 Python
Python中dict和set的用法讲解
Mar 28 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
群众路线批评与自我批评
2014/02/06 职场文书
高中学生期末评语
2014/04/25 职场文书
大学计划书范文800字
2014/08/14 职场文书
保险公司演讲稿
2014/09/02 职场文书
2014年卫生工作总结
2014/11/27 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python