Поки я досліджував проблему, яку я мав із лексичними закриттями коду 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
. Він друкує "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";
}
"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 error
for f in flist:
print f(2)
Як показує коментований рядок, i
на цей момент невідомо. Все-таки він друкує "4 4 4".