Javascript kodunda sözcüksel kapatma ile yaşadığım bir sorunu araştırırken Python'da bu sorunla karşılaştım:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Bu örneğin dikkatle önlendiğini unutmayın lambda
. Şaşırtıcı olan "4 4 4" yazdırır. "0 2 4" beklerdim.
Bu eşdeğer Perl kodu bunu doğru yapar:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
"0 2 4" yazdırılır.
Farkı açıklar mısınız?
Güncelleme:
Sorun değil ile i
küresel olmak. Bu aynı davranışı görüntüler:
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)
Yorum satırının gösterdiği gibi, i
o noktada bilinmemektedir. Yine de "4 4 4" yazdırır.