Python 嵌套 lambda 列表仅执行 lambda 列表的最后一个元素
Python list of nested lambdas executes last element of lambda list only
以下代码片段演示了嵌套 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?
要使第一个示例正常运行,请将变量存储为 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']
以下代码片段演示了嵌套 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?
要使第一个示例正常运行,请将变量存储为 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']