Python编程创造营之”def和lambda嵌套使用“的思考
问题描述:(原实验来自于Python中的”公式“实验指导手册第8页步骤11)
def func():
temp=[lambda x:x*i for i in range(4)]
return temp
for m in func():
print(m(3))
输出:
9
9
9
9
思考:为什么输出结果是这样?
问题分析:
白老师在讲解这个实验时并没有做解释,只是布置了个思考题,让我们自己去求索答案。
刚开始看到这个题目时,感觉很唐突,仅从人类大脑阅读审核代码,从python列表推导式来看,i的取值应该是0,1,2,3。所以直观看起来,最后的输出结果应该是0,3,6,9。为了验证想法,笔者在华为云ModelArts输入原实验代码,ModelArts平台截图如下:
结果和人类直觉相背,不是0,3,6,9,而是9,9,9,9.
那么合理的解释应该是python解释器面对函数def和lambda嵌套时,由于涉及函数嵌套和变量取值作用域空间,lambda函数中的i,并没有到列表求导式中依次取到0,1,2,3的取值,而是有且只取到了最后的3这个值。正因为只取到了3这个数值,所以func()函数中的temp列表中的lambda算式,都是x和3的乘积。所以4个lambda算式的print输出都是3和3的乘积,都是9。
查阅了lambda相关资料后,笔者发现,为了输出人类大脑中期望的输出0,3,6,9,需要重新设计代码(参考华为云ModelArts平台截图),在lambda算式中显式增加变量i,且通过i = i: x*i for i in range(4)就可以明确取到0,1,2,3的值,从而最终输出0,3,6,9.
思考总结:
综上所述,函数嵌套使用时需额外注意变量作用域空间问题,特别是涉及lambda计算时。
- 点赞
- 收藏
- 关注作者
评论(0)