【问题标题】:List comprehension and lambdas in Python [duplicate]Python中的列表理解和lambda [重复]
【发布时间】:2018-02-06 02:49:51
【问题描述】:

我想创建一个 lambda 列表,但结果并不如我所愿。

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 中都有自己的 ypossible 副本?

【问题讨论】:

  • 您的代码中只有一个y,在您创建列表后,y 的值为 9。

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


【解决方案1】:

您的 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 时都会提供一个新范围。

【讨论】:

    【解决方案2】:

    您需要循环和 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)
    

    【讨论】:

    • 这是一种非常简洁优雅的方式来说明必须做什么。
    猜你喜欢
    • 2023-01-02
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多