如何使用 lambda 函数在循环中定义非常量函数列表?

How to define a list of non-constant functions in a loop with lambda functions?

假设我想创建一个函数列表 funclist,这样这个列表中的函数就会这样:

funclist[0](x) = 0
funclist[1](x) = x
funclist[2](x) = 2*x
funclist[3](x) = 3*x

假设列表太长(比如大小为 100)而无法逐一定义这些函数,一种自然的写法是:

funclist = []
for k in range(100):
    f = lambda x: k*x
    funclist.append(f)

问题是这种方法不起作用,因为 Python 在函数定义中解释局部变量的方式。这是我经常在这个网站上看到的问题,例如 here or . Unfortunately, those users want to define constant functions, so the proposed solution (which is to define a local copy of the iterable variable k) do not work for me (it is also the same solution proposed in the Python FAQ)。例如,以下语法不起作用:

funclist = []
for k in range(100):
    f = lambda local_k=k, x: local_k*x
    funclist.append(f)

我找到的解决方案是:

funclist = []
for k in range(10):
    def f(x, product_factor=k): return x*product_factor
    funclist.append(f)

如我所愿。我也可以使用 partial 函数获得相同的结果:

from functools import partial 

def product(x,product_factor): return x*product_factor
funclist = []
for k in range(10):
    funclist.append( partial(product, product_factor=k) )

所以我的问题是:是否有任何方法可以仅使用 lambda 函数来实现此结果?或者我有一个 "moving parameter" 的事实注定我要以某种方式或其他方式定义两个变量的函数?让我准确地说我问这个是因为我试图更好地理解 Python.

中的函数和柯里化是如何工作的

您的 lambda 方法不起作用,因为您在位置参数之前有一个关键字参数。只需像在工作解决方案中那样翻转顺序即可:

funclist = [(lambda x, local_k=k: local_k*x) for k in range(100)]

>>> funclist[3](8)
24
>>> funclist[5](9)
45

最初的问题是 k 只在循环结束时被求值一次,而这里的函数创建,对 get_function 的调用,每次都会触发对 k 的求值。

当然你的带默认参数的解决方案也可以,这显然是这个问题最常见的解决方案

现在你说它对 lamdba 不起作用,只是因为你把默认参数放在第一位:

funclist = []
for k in range(100):
    f = lambda  x, local_k=k,: local_k*x
    funclist.append(f)


print(funclist[10](3)) #30
print(funclist[99](3)) # 297
print(funclist[0](3)) # 0

工作正常