为了账号安全,请及时绑定邮箱和手机立即绑定

求解释此python的lambda表达式

求解释此python的lambda表达式

四季花海 2019-05-13 08:52:34
求教一下表达式各变量是怎么变化的,以及结果,尤其是n怎么变呢?fun=[(lambdan:i+n)foriinrange(10)]

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

这是python中为数不多的“怪事”之一
fun=[(lambdan:i+n)foriinrange(10)]
#等同于
fun=[(lambdan:9+n)for_inrange(10)]
因为lambda内的参数i在运行时才能确定,不是在声明时确定。
最后fun保存了含有10个元素的数组,每一个元素都是lambda方法,该方法等于下面的lambda_item函数
deflambda_item(n):
return9+n
如果整个表达式用python代码来诠释的话,可以是这样
fun=[]
foriinrange(10):
fun.append((lambdan:9+n))
另一个让新人迷惑的是
a=[[0]]*3
a[0].append(1)
print(a)
打印出
[[0,1],[0,1],[0,1]]
                            
查看完整回答
反对 回复 2019-05-13
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

首先,感谢@李毅的回答,他回答的很好。
1、初次执行
那么,我们看看这个程序的运行结果是什么?
fun=[(lambdan:i+n)foriinrange(10)]
>>>fun
[at0x7f032e425668>,at0x7f032e4256e0>,at0x7f032e425758>,at0x7f032e4257d0>,at0x7f032e425848>,at0x7f032e4258c0>,at0x7f032e425938>,at0x7f032e4259b0>,at0x7f032e425a28>,at0x7f032e425aa0>]
>>>len(fun)
>>>10
从运行的结果可以看出,fun参数是一个以函数对象为元素的列表,列表的长度为10。其中的长度是由步进函数range(10)来决定的。
2、继续执行
我们进行往下执行。
>>>forfinfun:
...f(1)
...
10
10
10
10
10
10
10
10
10
10
结果出现了“意外”,并不是如想象中的那样,结果是相同的,没有步进。
3、修改步进函数的值
>>>fun=[(lambdan:i+n)foriinrange(2)]
>>>fun
[at0x7f032e42e050>,at0x7f032e42e140>]
>>>fun=[(lambdan:i+n)foriinrange(3)]>>>fun
[at0x7f032e425668>,at0x7f032e4256e0>,at0x7f032e425758>]
>>>
从上面的执行结果,我们可以明显的看出,步进函数决定了list的长度,但是这个list比较特别的地方是列表的元素是function对象,而对于function来说,就涉及到参数的作用域问题,而function对象里的i参数,明显是一个全局变量,@Jasoney说的很好,这个i参数随着步进函数range(10)的迭代,不断变化,最终确定值为9,那么function对象最终可以确定为lambadn:9+n,所以,最终的执行结果虽然“奇怪”,但也合乎逻辑。
                            
查看完整回答
反对 回复 2019-05-13

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号