在Python中列出理解和lambdas

时间:2017-08-28 18:58:59

标签: python python-3.x lambda list-comprehension

我想创建一个lambdas列表,但它并没有像我希望的那样完成。

L = [(lambda x: x/y) for y in range(10)]

我希望列表中的每个函数都将其参数除以其索引,但所有函数只能除以最后一个索引。

>>> L[1](5)
0.5555555555555556
>>> L[5](5)
0.5555555555555556
>>> 5/9
0.5555555555555556

这种列表是否理解,每个lambda在Python中都有自己的y副本?

2 个答案:

答案 0 :(得分:2)

lambda中的y指的是y在其范围内的最后一个值,即9。

获得所需行为的最简单方法是在lambda中使用默认参数:

lambda x, y=y: x/y

这将在定义lambda函数时捕获y的值。

您还可以执行“double-lambda”,调用返回所需lambda的函数,传递所需的y值:

(lambda y: lambda x: x/y)(y)

这里,外部lambda每次调用时都会提供一个新范围。

答案 1 :(得分:1)

你需要循环和lambda在不同的范围内。

def make_divider(y):
    return lambda x: x / y

L = [make_divider(y) for y in range(10)]

print(L[2](5) == 5 / 2)
print(L[4](5) == 5 / 4)