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中string模块各属性以及函数的用法介绍
May 30 Python
Python生成器generator用法示例
Aug 10 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python实现弹跳小球
May 13 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
python numpy 矩阵堆叠实例
Jan 17 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
python3中for循环踩过的坑记录
Dec 14 Python
python通配符之glob模块的使用详解
Apr 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
JQuery 入门实例1
2009/06/25 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
javascript 实现map集合
2015/04/03 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
对于Python装饰器使用的一些建议
2015/06/03 Python
详解Python命令行解析工具Argparse
2016/04/20 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python开发游戏的前期准备
2019/05/05 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
法学毕业生自我鉴定
2013/11/08 职场文书
集团薪酬管理制度
2014/01/13 职场文书
总经理助理的职责
2014/03/14 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
转让协议书
2015/01/27 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python
设置IIS Express并发数
2022/07/07 Servers