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

如何创建Python Lambda列表(在列表理解/ for循环中)?

如何创建Python Lambda列表(在列表理解/ for循环中)?

catspeake 2019-11-03 04:04:48
我想从Python中的常量列表创建lambda对象列表;例如:listOfNumbers = [1,2,3,4,5]square = lambda x: x * xlistOfLambdas = [lambda: square(i) for i in listOfNumbers]但是,当我运行它们时,这将创建一个lambda对象列表:for f in listOfLambdas:    print f(),我希望它会打印1 4 9 16 25而是打印:25 25 25 25 25似乎所有lambda都被赋予了错误的参数。我做错了什么,有办法解决吗?我认为我使用的是Python 2.4。编辑:更多尝试的事情,例如这样:listOfLambdas = []for num in listOfNumbers:    action = lambda: square(num)    listOfLambdas.append(action)    print action()打印从1到25的期望平方,然后使用之前的print语句:for f in listOfLambdas:    print f(),仍然给我所有25的。现有的lambda对象如何在这两个打印调用之间改变?
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我猜想您在列表推导中创建的lambda绑定到变量i,最终变量i最终为5。因此,当您在事后求值时,lambda全部绑定为5并最终计算25.在第二个示例中,num也发生了同样的事情。当您评估循环内的lambda时,num的值没有改变,因此您获得了正确的值。循环后,num为5 ...


我不太确定您要做什么,所以不确定如何提出解决方案。这个怎么样?


def square(x): return lambda : x*x

listOfLambdas = [square(i) for i in [1,2,3,4,5]]

for f in listOfLambdas: print f()

这给了我预期的输出:


1

4

9

16

25

另一种思考方式是,lambda在创建时就“捕获”其词法环境。因此,如果您给它num,它直到被调用时才真正解析该值。这既混乱又强大。



查看完整回答
反对 回复 2019-11-04
?
交互式爱情

TA贡献1712条经验 获得超3个赞

你有:


listOfLambdas = [lambda: i*i for i in range(6)]


for f in listOfLambdas:

    print f()

输出:


25

25

25

25

25

25

您需要粗鲁!除了美味之外,请使用此默认值“ hack”。


listOfLambdas = [lambda i=i: i*i for i in range(6)]


for f in listOfLambdas:

    print f()

输出:


0

1

4

9

16

25

注意i=i。那就是魔术发生的地方。



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信