जब मैं जावास्क्रिप्ट कोड में लेक्सिकल क्लोजर के साथ एक समस्या की जांच कर रहा था, मैं पायथन में इस समस्या के साथ आया था:
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";
}
"2 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" प्रिंट करता है।