词汇闭包是如何工作的?在研究Javascript代码中的词法闭包问题时,我在Python中遇到了这个问题:flist = []for i in xrange(3):
def func(x): return x * i
flist.append(func)for f in flist:
print f(2)注意,这个例子避免了lambda..它打印“44 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";}打印“0 2 4”。你能解释一下区别吗?最新情况:问题不是带着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 errorfor f in flist:
print f(2)如注释行所示,i在这一点上是未知的。尽管如此,它还是打印了“4 4 4”。
3 回答
米脂
TA贡献1836条经验 获得超3个赞
i
i
def
flist = []for i in xrange(3): def func(x, i=i): # the *value* of i is copied in func() environment return x * i flist.append(func)for f in flist: print f(2)
慕勒3428872
TA贡献1848条经验 获得超6个赞
functools
from functools import partial flist = []def func(i, x): return x * ifor i in xrange(3): flist.append(partial(func, i))for f in flist: print f(2)
添加回答
举报
0/150
提交
取消