免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2861 | 回复: 1

f0, f1, f2 = [lambda x: x*i for i in range(3)] 原理是什么? [复制链接]

论坛徽章:
0
发表于 2016-11-10 18:40 |显示全部楼层
本帖最后由 lovekaiyuan 于 2016-11-10 18:48 编辑

第一种情况
f0, f1, f2 = [lambda x: x*i for i in range(3)]

f0(1) == f1(1) == f2(1) == 2


第二种情况

f = [lambda x: x*i for i in range(3)]

for l in f:
    l(1),   

结果 2 2 2


第三种情况

f = (lambda x: x*i for i in range(3))

for l in f:
    l(1),   

结果 0 1 2


第四种情况

f0, f1, f2 = (lambda x: x*i for i in range(3))

f0(1) == f1(1) == f2(1) == 2


上面前两种情况可以用 python最后绑定的行为解释,那第三种情况就冲突了,可以用 元组和列表的区别来解释,不过具体的原理不清楚,但是第四个出来以后就懵圈了,这个是什么情况,也是用的元组,只不过没有遍历,然后结果就不一样了。

希望了解期中原理的高手解答一下。谢谢!!

论坛徽章:
0
发表于 2017-01-10 15:30 |显示全部楼层
本帖最后由 seeLnd 于 2017-01-10 15:58 编辑

第三种情况不是元组,而是返回一个生成器,你在调用 l(1)  的时候,是在生成器执行过程之中,所以函数 l  中的 i 变量随着生成器的迭代在变化,所以最终结果会有变化。
而第四种情况你一下把生成器迭代完了,和第一第二种类似,都是所有代码都执行完了,i 都处于最后一个值 2, 所以值没有变化.
稍微改一下你的代码:

f = (lambda x: x*i for i in range(3))

ll = []
for l in f:
    ll.append(l)
    l(1)

结果 0 1 2
但是同时   ll[0](1) == ll[1](1) == ll[2](1) == 2 (相当于第四种情况)
l(1) 的调用是在生成器迭代过程中,i值一直在变化
ll[x](1) 的调用是生成器迭代完了,i值固定是2



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP