我在 CentOS 7 环境中使用 Python 3.6.10。我正在尝试创建一个基于结构化规范执行的命令列表。将其视为 lambda 列表似乎很自然且符合 Python 风格。我通过遍历规范来构建 lambda 列表。令我惊讶的是,当我执行结果时,我发现每个 lambda 都是相同的,因为它在创建 lambda 时没有捕获其参数。我认为这是一个错误。
以下是说明该行为的示例代码:
specification = {
'labelOne': ['labelOne.one', 'labelOne.two', 'labelOne.three', 'labelOne.four', 'labelOne.five'],
'labelTwo': ['labelTwo.one', 'labelTwo.two', 'labelTwo.three', 'labelTwo.four', 'labelTwo.five'],
'labelThree': ['labelThree.one', 'labelThree.two', 'labelThree.three', 'labelThree.four', 'labelThree.five'],
'labelFour': ['labelFour.one', 'labelFour.two', 'labelFour.three', 'labelFour.four', 'labelFour.five'],
'labelFive': ['labelFive.one', 'labelFive.two', 'labelFive.three', 'labelFive.four', 'labelFive.five'],
}
lambdas = []
for label, labelStrings in specification.items():
for labelString in labelStrings:
lambdaString = f"""Label: \"{label}\" with labelString: \"{labelString}\""""
oneArgLambda = lambda someArg: print(someArg, lambdaString)
lambdas.append(oneArgLambda)
for each in lambdas:
each('Show: ')
我期望看到这个:
Show: Label: "labelOne" with labelString: "labelOne.one"
Show: Label: "labelOne" with labelString: "labelOne.two"
Show: Label: "labelOne" with labelString: "labelOne.three"
Show: Label: "labelOne" with labelString: "labelOne.four"
Show: Label: "labelOne" with labelString: "labelOne.five"
Show: Label: "labelTwo" with labelString: "labelTwo.one"
Show: Label: "labelTwo" with labelString: "labelTwo.two"
Show: Label: "labelTwo" with labelString: "labelTwo.three"
Show: Label: "labelTwo" with labelString: "labelTwo.four"
lambda 的参数绑定是在执行 lambda 时发生的,而不是在创建 lambda 时发生的。这至少是出乎意料的,而且我认为可以说是错误的。
我认为 lambda 尽管有局限性,但应该创建一个 CLOSURE —— 它的整个目的是捕获其参数在创建时的状态,以便稍后在计算 lambda 时可以使用它们。这就是为什么它被称为“闭包”,因为它在创建时关闭了其参数的值。
我有什么误解吗?
德玛西亚99
婷婷同学_
幕布斯7119047
相关分类