python lambda函数列表,不带部分

python lambda函数列表,不带部分,python,list,function,lambda,list-comprehension,Python,List,Function,Lambda,List Comprehension,我一直在尝试使用列表理解在python中生成lambda函数列表。但它不起作用 比如说 fl=[lambda x: x**i for i in range(5)] 我已经检查了另一个问题,它基本上基于i的引用生成相同的函数 所以我也试过了 from functools import partial fl=[partial(lambda x: x**i) for i in range(5)] 但它也不起作用。任何帮助都将不胜感激。干杯~ 您实际上是在按名称传递i fl=[lambda x:

我一直在尝试使用列表理解在python中生成lambda函数列表。但它不起作用

比如说

fl=[lambda x: x**i for i in range(5)]
我已经检查了另一个问题,它基本上基于i的引用生成相同的函数

所以我也试过了

from functools import partial

fl=[partial(lambda x: x**i) for i in range(5)]
但它也不起作用。任何帮助都将不胜感激。干杯~


您实际上是在按名称传递
i

fl=[lambda x: x**i for i in range(5)]
每次执行
lambda
时,它都会将相同的
i
绑定到函数,因此当函数执行时(稍后),它使用当时的
i
值(将为4)。您应该将其作为默认参数传入:

fl=[lambda x, j=i: x**j for i in range(5)]

实际上,我注意到你误用了
partial
。在这里:

fl = [partial(lambda x, y: y ** x, i) for i in range(5)]

这也行得通

另一个常见的解决方法是使用闭包:

def create_f(i):
    def f(x):
        return x**i
    return f

fl = [create_f(i) for i in range(5)]

@Jeff Mercado
fl[0](2)=fl[1](2)=16
Hmm,这是一个难题。我不认为有什么方法可以防止I被更新,因为它是对循环变量的引用。为什么要创建此函数列表?有没有可能用不同的方法来解决你的大问题?很有趣。因此,在本例中,Python的行为似乎与JavaScript类似。这与范围界定并没有真正的关系。这是由“外部作用域的关闭变量”的解释方式造成的(Python选择共享相同的变量而不是复制其值),这与许多其他语言(如JS和C#)的工作方式确实相同。它与作用域有关。每个lambda都有相同的作用域,这意味着它们都有相同的变量。如果变量改变,所有lambda的结果也会改变。将该值作为默认参数分配给lambda意味着它们不再需要访问(甚至不需要保留)外部作用域。每个lambda都有自己的作用域。这些作用域在定义时不包括
i
值的副本(与默认值的情况相同),因此它们在运行时从包围作用域访问该值。他们这样做是因为定义了upvalues不应成为本地副本,这可能被认为是一个范围决定,但这并不是因为他们没有自己的范围。“共享”可能比我评论中的“有”更好,但我坚持我的答案。@jerry,是的,我只是用了
j
,因为它能让事情变得更清楚(无论如何,在我看来)。
def create_f(i):
    def f(x):
        return x**i
    return f

fl = [create_f(i) for i in range(5)]