尝试使用闭包从函数签名中删除变量时,您可能会遇到意外行为。具体来说,未包含在另一个函数中的 lambda 函数返回所有实例的变量的最后一个值。
要理解此行为,重要的是要认识到闭包捕获名称而不是值。当您将 lambda 定义为 lambda x: test_fun(n, x) 时,n 变量不会在函数内计算,而是在调用时计算。因此,它假定的值是循环中的最后一个值。
要使用闭包有效地“消除”变量,必须将该变量作为参数传递给函数。这会将变量的当前值分配给函数并有效地“锁定它”。例如:
<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]] # Bad, captured value is last value stuff = [lambda x, n=n: n+x for n in [1, 2, 3]] # Good, n is locked in</code>
或者,您可以使用两个嵌套函数:
<code class="python">def makeFunc(n): return lambda x: x+n stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
这里,makeFunc 中的 lambda 捕获局部 n 变量而不是全局变量。每个 makeFunc 调用都会创建一个新的局部变量,确保返回的 lambda 函数具有唯一的 n 值。
最终,简单性和灵活性之间的选择取决于您。您可以选择在返回的函数中使用额外参数来创建更简单的函数,也可以选择使用涉及两个嵌套函数的更复杂的函数创建过程来创建更干净的函数。
以上是为什么 Lambda 闭包捕获名称而不是值?的详细内容。更多信息请关注PHP中文网其他相关文章!