আমি জাভাস্ক্রিপ্ট কোডে লাক্ষিক বন্ধ হওয়ার সাথে আমার যে সমস্যাটি ছিল তা তদন্ত করার সময় পাইথনে আমি এই সমস্যাটি নিয়ে এসেছি:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
মনে রাখবেন যে এই উদাহরণটি মনঃসুলভভাবে এড়িয়ে চলে lambda
। এটি "4 4 4" মুদ্রণ করে, যা অবাক করে। আমি "0 2 4" আশা করব।
এই সমতুল্য পার্ল কোডটি এটি সঠিকভাবে করে:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
"0 2 4" মুদ্রিত হয়েছে।
আপনি দয়া করে পার্থক্য ব্যাখ্যা করতে পারেন?
হালনাগাদ:
সমস্যাটি বিশ্বব্যাপী হওয়ার সাথে নয়i
। এটি একই আচরণ প্রদর্শন করে:
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)
যেমন মন্তব্য করা লাইনটি দেখায়, i
সেই সময়ে অজানা। তবুও, এটি "4 4 4" মুদ্রণ করে।