为什么 Lambda 闭包捕获名称而不是值?

DDD
发布: 2024-10-21 13:15:30
原创
784 人浏览过

Why Do Lambda Closures Capture Names Instead of Values?

Python Lambda 闭包作用域

尝试使用闭包从函数签名中删除变量时,您可能会遇到意外行为。具体来说,未包含在另一个函数中的 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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板