解读 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 解决方案
实现预期行为在 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中文网其他相关文章!