当我在研究 Javascript 代码中的 lexical 闭包问题时,我在 Python 中遇到了这个问题:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
注意,这个例子小心地避开了 lambda
。它打印“444”,这是令人惊讶的。我期望“024”。
这个等价的 Perl 代码做得很好:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
“024”打印出来了。
你能解释一下这两者的区别吗?
更新:
问题 不是与 i
是全局的。这显示了相同的行为:
flist = []
def outer():
for i in xrange(3):
def inner(x): return x * i
flist.append(inner)
outer()
#~ print i # commented because it causes an error
for f in flist:
print f(2)
如注释行所示,i
在这一点上是未知的。但是,它打印“444”。