ขณะที่ฉันกำลังตรวจสอบปัญหาที่ฉันมีเกี่ยวกับการปิดคำศัพท์ในรหัส Javascript ฉันมาพร้อมปัญหานี้ใน Python:
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"
รหัส Perl ที่เทียบเท่านี้ไม่ถูกต้อง:
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"