Пока я изучал проблему, связанную с лексическими замыканиями в коде 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".