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将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python实现的桶排序算法示例
Nov 29 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
Python代码太长换行的实现
Jul 05 Python
由面试题加深对Django的认识理解
Jul 19 Python
Python的Lambda函数用法详解
Sep 03 Python
学习Django知识点分享
Sep 11 Python
python中68个内置函数的总结与介绍
Feb 24 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
python中Ansible模块的Playbook的具体使用
May 28 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函数scandir排除特定目录
2014/06/12 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
QQ登录简单实现代码
2021/03/09 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
全面理解闭包机制
2016/07/11 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
简单介绍Python中的len()函数的使用
2015/04/07 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
Python函数装饰器实现方法详解
2018/12/22 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
python实现合并两个排序的链表
2019/03/03 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
工程现场管理求职自荐信
2013/10/02 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
社区母亲节活动方案
2014/03/05 职场文书
党员创先争优活动总结
2014/05/04 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
优秀教师事迹材料
2014/12/15 职场文书
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers