Sementara saya sedang menyelidiki masalah yang saya miliki dengan penutupan leksikal dalam kode Javascript, saya menemukan masalah ini dengan Python:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Perhatikan bahwa contoh ini dengan sadar menghindari lambda
. Mencetak "4 4 4", yang mengejutkan. Saya harapkan "0 2 4".
Kode Perl yang setara ini melakukannya dengan benar:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
"0 2 4" dicetak.
Bisakah Anda jelaskan perbedaannya?
Memperbarui:
Masalahnya bukan dengan i
menjadi global. Ini menampilkan perilaku yang sama:
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)
Seperti yang ditunjukkan oleh baris yang dikomentari, i
tidak diketahui pada saat itu. Namun, ia mencetak "4 4 4".