Python中的延迟绑定原理详解
作者:爱哭鼻子的小忧伤 时间:2022-07-08 16:18:35
直接看下面例子
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的默认值都不一样。
来源:https://www.cnblogs.com/heimaguangzhou/p/11640670.html
标签:python,延迟,绑定
0
投稿
猜你喜欢
Go语言编程中对文件读写的基本方法整理
2023-06-24 09:31:07
MySQL数据库查询之多表查询总结
2024-01-13 21:49:47
python脚本实现统计日志文件中的ip访问次数代码分享
2021-03-17 08:40:08
Python django搭建layui提交表单,表格,图标的实例
2022-09-18 19:40:19
Mysql中批量替换某个字段的部分数据(推荐)
2024-01-14 19:56:04
selenium+python实现自动化登录的方法
2021-08-07 13:38:08
django 将自带的数据库sqlite3改成mysql实例
2024-01-19 14:52:21
python实现跳表SkipList的示例代码
2022-04-05 05:01:53
使用SQL SERVER存储过程实现历史数据迁移方式
2024-01-13 04:07:40
详解python实现识别手写MNIST数字集的程序
2021-05-01 13:17:40
解决Python数据可视化中文部分显示方块问题
2021-01-27 03:53:36
10个糟糕的IE Bug及其修复
2010-05-13 16:26:00
老生常谈python之鸭子类和多态
2023-09-26 09:00:26
Python采集王者皮肤图片实战示例
2021-08-02 12:09:23
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2024-05-11 09:43:01
MySQL优化之大字段longtext、text所生产的问题
2024-01-28 11:37:43
SQL_Server全文索引的用法解析
2024-01-17 08:37:14
numpy matrix和array的乘和加实例
2022-09-29 15:17:45
python爬取各省降水量及可视化详解
2023-08-04 15:19:57
Python函数中的全局变量详解
2022-08-05 13:58:34