来来来,不要往解释器里扔,告诉我答案,并解释,是时候秀一波技术了,哈哈

2017-08-04 10:05:23 +08:00
 altboy
def mul():
return [lambda x: i*x for i in range(4)]
print([m(2) for m in mul()])
4393 次点击
所在节点    Python
10 条回复
SingeeKing
2017-08-04 10:10:04 +08:00
首先你确定 def 和 print 不是在两行吗
SingeeKing
2017-08-04 10:10:40 +08:00
好吧什么时候改了。。。

那么,你确定第二行没有缩进吗。。。
SingeeKing
2017-08-04 10:22:29 +08:00
mul() 返回的应该是一个列表 [lambda x: 3 * x, lambda x: 3 * x, lambda x: 3 * x, lambda x:3 * x]

因为匿名函数存储在列表中仅存储了地址,四次拷贝为浅拷贝,之后就是改变了 i 的值,因此四个元素一同改变

最终返回结果 [6, 6, 6, 6]

(以上都是我瞎说的)
besto
2017-08-04 10:23:41 +08:00
araraloren
2017-08-04 10:33:25 +08:00
~~依赖缩进的语言 遇到了 缩进不好使的网站。。(逃
Readme16
2017-08-04 10:33:28 +08:00
三楼正解,另如果 return (lambda x:x*i for i in range(4)) 那么输出的是[0,2,4,6]
skadi
2017-08-04 10:41:31 +08:00
缩进语言怎么面向 ctrlC 编程?:)
altboy
2017-08-04 10:41:59 +08:00
@SingeeKing 有缩进
fengzixu
2017-08-04 16:59:57 +08:00
http://littledriver.net/2017/03/05/%E5%B7%A5%E4%BD%9C%E4%B8%AD%E8%B8%A9%E8%BF%87%E7%9A%84%E7%9A%84%E5%9D%91%E4%B9%8Bgolang%E7%9A%84%E4%B8%B4%E6%97%B6%E5%8F%98%E9%87%8F/ 在 golang 里面同样有这种问题,之前写过一个类似的博客。但是不知道,真正的原因是不是这样。总感觉是值都存在了同一个内存的位置
jiang42
2017-08-04 17:18:39 +08:00
是 free variable capture 的问题

fs = [lambda x: x*i for i in range(3)]
i = 10
[f(1) for f in fs]
[10, 10, 10]

#6 楼的情况是返回了一个 generator,在 i 更新之前 lambda 就出来了

想把 i 锁在 lambda 里可以这么做
def bar(i):
return lambda x:x*i

def foo():
return [bar(i) for i in range(3)]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/380331

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX