詞匯閉包是如何工作的?在研究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
提交
取消