我需要创建函数(很多)并存储在数组或列表中。我尝试使用列表推导来生成函数(如下面所示的代码,确实是一个简单的案例)。
f = [lambda x: x*i for i in range(0,3)]
给出
f[0](1) = 2 # expected 0
f[1](1) = 2 # expected 1
f[2](1) = 2 # expected 2 (no prblm with last case)
但是,如果不使用迭代器(如列表推导)来生成函数,则如果我在列表内显式编写函数(定义每个函数),则可以正常工作。
那么,上述代码(使用迭代器生成匿名函数)有什么问题吗?
答案 0 :(得分:2)
我相信语法的这种变体将为您提供所需的内容:
f = [lambda x, i=n: x * i for n in range(0, 3)]
示例
>>> f[0](1)
0
>>> f[1](1)
1
>>> f[2](1)
2
>>>
我相信@ user2357112引导您迈向的是变化:
from functools import partial
f = [partial(lambda x, i: x * i, i=n) for n in range(0, 3)]
从引用的重复页面中调出来可能并不容易。
答案 1 :(得分:1)
调用函数时将评估lambda函数的内部,而不是在创建函数时对其进行评估。此时,i
的值为2
。您可以运行以下命令进行验证:
>>> f = [lambda x: x*i for i in range(0,3)]
>>> i
2
cdlane在回答中指出,您可以通过将range()
语句中的值存储到lambda函数的默认参数中来解决此问题:
>>> f = [lambda x, i=i: x*i for i in range(0,3)]
>>> f[0](1)
0
>>> f[1](1)
1
>>> f[2](1)
2
之所以起作用,是因为与函数主体不同,在创建函数时会评估函数 definition 。