Trong khi tôi đang điều tra một vấn đề tôi gặp phải với việc đóng từ vựng trong mã Javascript, tôi đã gặp vấn đề này trong Python:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Lưu ý rằng ví dụ này lưu tâm tránh lambda
. Nó in "4 4 4", thật đáng ngạc nhiên. Tôi mong đợi "0 2 4".
Mã Perl tương đương này thực hiện đúng:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
"0 2 4" được in.
Bạn có thể vui lòng giải thích sự khác biệt?
Cập nhật:
Vấn đề không phải là có i
được toàn cầu. Điều này hiển thị hành vi tương tự:
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)
Như dòng bình luận cho thấy, i
không rõ tại thời điểm đó. Tuy nhiên, nó in "4 4 4".