Python编程创造营之”def和lambda嵌套使用“的思考

举报
大卡 发表于 2021/04/04 21:00:35 2021/04/04
【摘要】 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平台截图如下:

lambda函数1.JPG

    结果和人类直觉相背,不是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函数.JPG

思考总结:

     综上所述,函数嵌套使用时需额外注意变量作用域空间问题,特别是涉及lambda计算时。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。