Javascript閉パッケージとpython閉パッケージ


次のコードはjavscript関数の閉パッケージをよく示しています.javascriptにはブロック作用ドメインがなく、関数作用ドメインしかありません.
 
var f=[];
for(var i=0;i<10;i++)
f.push(function(){alert(i);});

f[0]();

 
10を印刷します.すべてのf関数が同じ役割ドメインwindowを共有するため、呼び出し時に同じwindowのi、すなわちループ終了後のiを検索する
 
解決策は多く,そのうちの1つはiが関数の最下層の役割ドメインにコピーされることである.
 
var f=[];
for(var i=0;i<10;i++)
f.push(function(i){return function(){alert(i);}}(i));
//      ,  copy i         
//f.push(function(){var t=i;return function(){alert(t);}}());
f[0]();


 
ある人によると、perl pythonの最初の表示で0を出力でき、ブロックの役割ドメインがあるのでjavascriptのほうが合理的だと思いますが、perl pythonのやり方では、関数を定義するときに関数に使われる外部変数を全部自分でcopyするのではないでしょうか.
perl、python、本当ですか?
 
PS:後記:
 
pythonにはブロックの役割ドメインはありません.モジュール、クラス、関数の役割ドメインだけです.上記javascriptの等価pythonコード:
 
fs=[]
i=0
while i<10:
   
    def t():
        print i,"!"
    fs.append(t)
    i=i+1
    
fs[0]()

#       
print t
print fs[0]
print fs[9]
 
出力10はjavasciptと一致!
 
参照先:
 
JavaScriptオブジェクトモデル-実行モデル
 
python閉パッケージ