Mientras investigaba un problema que tenía con los cierres léxicos en el código Javascript, encontré este problema en Python:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Tenga en cuenta que este ejemplo evita cuidadosamente lambda
. Imprime "4 4 4", lo cual es sorprendente. Yo esperaría "0 2 4".
Este código Perl equivalente lo hace bien:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
Se imprime "0 2 4".
¿Puedes por favor explicar la diferencia?
Actualizar:
El problema no es con i
ser global. Esto muestra el mismo comportamiento:
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)
Como muestra la línea comentada, i
se desconoce en ese momento. Aún así, imprime "4 4 4".