是什么导致 Python 中出现意外的 Lambda 关闭行为?

Mary-Kate Olsen
发布: 2024-10-21 13:10:30
原创
887 人浏览过

What Causes Unexpected Lambda Closure Behavior in Python?

Python Lambda 闭包作用域

理解 Python 中 lambda 闭包的行为可能很棘手。在本文中,我们探讨了 lambda 函数表现异常的情况,在所有情况下返回相同的值。

问题:

考虑以下代码:

<code class="python">names = ['a', 'b', 'c']

def test_fun(name, x):
    print(name, x)

def gen_clousure(name):
    return lambda x: test_fun(name, x)

funcs1 = [gen_clousure(n) for n in names]
funcs2 = [lambda x: test_fun(n, x) for n in names]</code>
登录后复制

当调用 funcs1 中的函数时,我们得到了预期的输出:

a 1
b 1
c 1
登录后复制

但是,当调用 funcs2 中的函数时,我们得到了意想不到的结果:

c 1
c 1
c 1
登录后复制

预期输出应该与第一种情况相同,但相反,我们在所有情况下都会看到姓氏“c”的值。

解释:

理解这种行为的关键在于闭包的概念。 Python 中的闭包允许内部函数从其封闭范围访问变量。在第一种情况 (funcs1) 中,lambda 函数是在循环内创建的,但它从封闭范围捕获变量名称并将其绑定到 lambda 函数内的名称。

在第二种情况 (funcs2) ),但是,lambda 函数直接引用封闭范围中的变量 n,而不将其绑定到 lambda 函数内的名称。这意味着当调用 lambda 函数时,它会计算当时的 n,它总是返回循环中的最后一个值,从而导致意外的输出。

避免问题:

为了避免此问题并实现所需的行为,我们必须确保 lambda 函数从封闭范围捕获变量并将其绑定到 lambda 函数内的名称。一种方法是将 lambda 函数包装在另一个函数中:

<code class="python">def makeFunc(n):
    return lambda x: x+n</code>
登录后复制

makeFunc 中生成的 lambda 函数从封闭范围捕获 n 的值并将其绑定到 lambda 函数内的名称,实现期望的行为。

以上是是什么导致 Python 中出现意外的 Lambda 关闭行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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