【问题标题】:Python list of nested lambdas executes last element of lambda list only嵌套 lambda 的 Python 列表仅执行 lambda 列表的最后一个元素
【发布时间】:2020-10-13 02:35:35
【问题描述】:

以下代码 sn-p 演示了嵌套 lambda 列表仅计算原始 lambda 列表的最后一个元素。

eqs_test = [
    (lambda x: f"0"),
    (lambda x: f"1"),
    (lambda x: f"2"),
    (lambda x: f"3"),
]

# unexpected output
print([a(1) for a in [
    lambda x: f"{e1(0)}-{e2(0)}" for e1, e2 in zip(eqs_test[1:], eqs_test[:-1])
]])

# expected output (no outer lambda used here for testing)
print([a for a in [
    f"{e1(0)}-{e2(0)}" for e1, e2 in zip(eqs_test[1:], eqs_test[:-1])
]])

输出是:

['3-2', '3-2', '3-2']
['1-0', '2-1', '3-2']

我希望在这两种情况下都有第二个输出,但不知何故 lambda 没有正确存储(3-2 只是最后生成的 lambda)。这里发生了什么,如何存储外部 lambda 以使其运行正确的嵌套 lambda?

【问题讨论】:

    标签: python lambda list-comprehension


    【解决方案1】:

    要使第一个示例正常运行,请将变量存储为 lambda 参数。否则,lambda 将始终打印 e1 和 e2 的最后一个值:

    eqs_test = [
        (lambda x: f"0"),
        (lambda x: f"1"),
        (lambda x: f"2"),
        (lambda x: f"3"),
    ]
    
    # unexpected output
    print([a(1) for a in [
        lambda x, e1=e1, e2=e2: f"{e1(0)}-{e2(0)}" for e1, e2 in zip(eqs_test[1:], eqs_test[:-1])
    ]])
    

    打印:

    ['1-0', '2-1', '3-2']
    

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多