Alors que j'enquêtais sur un problème que j'avais avec fermetures lexicales dans le code Javascript, je suis venu le long de ce problème en Python:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Notez que cet exemple en pleine conscience évite lambda
. Il imprime "4 4 4", ce qui est surprenant. Je m'attends à "0 2 4".
C'est l'équivalent du code Perl-t-il droit:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
"0 2 4" est imprimé.
Pouvez-vous nous expliquer la différence ?
Mise à jour:
Le problème n'est pas avec i
mondial. Cela affiche le même comportement:
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)
Comme le commentaire de la ligne, i
est inconnu à ce point. Pourtant, il imprime "4 4 4".