首页 > 后端开发 > Python教程 > 为什么 Python 的词法闭包行为与 Perl 不同?

为什么 Python 的词法闭包行为与 Perl 不同?

Patricia Arquette
发布: 2024-12-12 16:42:10
原创
122 人浏览过

Why Does Python's Lexical Closure Behavior Differ from Perl's?

解读 Python 与 Perl 中的词法闭包

在探索 Javascript 中的词法闭包时,出现了关于它们在 Python 中的特殊行为的问题。考虑以下 Python 代码:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)
登录后复制

令人惊讶的是,它输出“4 4 4”而不是预期的“0 2 4”。

相反,这个等效的 Perl 代码生成所需的结果结果:

my @flist = ();

foreach my $i (0 .. 2)
{
    push(@flist, sub {$i * $_[0]});
}

foreach my $f (@flist)
{
    print $f->(2), "\n";
}
登录后复制

底层证券区别

关键区别在于闭包如何捕获其环境。

  • Python:在循环内创建的函数都共享循环的闭包环境。当循环变量 i 被修改时,所有函数都引用相同的修改后的 i。
  • Perl: 在循环中创建的函数每个都有自己的闭包,捕获 i 在它们运行时的值定义。

Python 解决方案

实现预期行为在 Python 中,您需要为每个函数强制使用单独的环境。一种解决方案是创建一个函数创建器,它返回具有不同闭包的函数:

flist = []

for i in xrange(3):
    def funcC(j):
        def func(x): return x * j
        return func
    flist.append(funcC(i))

for f in flist:
    print f(2)
登录后复制

此方法确保每个函数都有自己独特的闭包,并具有自己唯一的 i 值。

以上是为什么 Python 的词法闭包行为与 Perl 不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

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