私は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」と印刷します。