我想创建一个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
副本?
答案 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)