使用 lambda 和列表理解时的惰性评估

Lazy evaluation when use lambda and list comprehension

这是示例 python 代码。

f_list = [lambda x : x ** i for i in range(5)]
[f_list[j](10) for j in range(5)]

我认为输出是:

[1, 10, 100, 1000, 10000]

但我得到的是这个:

[10000, 10000, 10000, 10000, 10000]

我想知道当我 运行 这段代码时到底发生了什么。与懒惰评估有什么联系。

这里有一个很好的例子来说明为什么柯里化很好,你可以像这样柯里化你的函数来实现你的目标:

f_list = [(lambda y : lambda x : x ** y)(i) for i in range(5)]
r = [f_list[j](10) for j in range(5)]

结果将是:

=> [1, 10, 100, 1000, 10000]

柯里化:

理解 curry 对我来说是什么的简单方法是下一个,而不是给一个函数它需要的所有参数,你创建一个函数,它总是接收一个参数,returns另一个再次接受一个参数的函数,在最后一个函数中,您使用所有参数进行所需的转换

一个小例子:

sum_curry = lambda x : lambda y : x + y

这里你有一个简单的求和函数,但假设你想要函数 plus_one,好的,你可以像这样重用上面的函数:

plus_one = sum_curry(1)