Mentre stavo studiando un problema che avevo con le chiusure lessicali nel codice Javascript, ho riscontrato questo problema in Python:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Si noti che questo esempio evita consapevolmente lambda
. Stampa "4 4 4", il che è sorprendente. Mi aspetto "0 2 4".
Questo codice Perl equivalente fa bene:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
Viene stampato "0 2 4".
Puoi per favore spiegare la differenza?
Aggiornare:
Il problema non è con l' i
essere globale. Questo mostra lo stesso comportamento:
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)
Come mostra la riga commentata, i
è sconosciuto a quel punto. Tuttavia, stampa "4 4 4".