Pythonのお勉強 Part32
at TECH
[
2ch
|
▼Menu
]
■コピペモード
□
スレを通常表示
□
オプションモード
□このスレッドのURL
■項目テキスト
150:デフォルトの名無しさん 09/02/22 19:52:09 pythonのlambdaで実験していて、以下の問題に突き当たりました。 識者の方がいらっしゃいましたら、 ご教授願えるとありがたいです。 //無名関数をn個リストにして返す関数 def make_funcs(n): fn_list = [] for i in range(n): fn_list.append(lambda x : i*x) return fn_list //code block fL = make_funcs(5) for f in fL: print(f(10)) //実行結果 40 40 40 40 //期待する実行結果 0 10 20 30 40 for文中のiが上手く認識されていないように思えます。 Schemeのクロージャとは振る舞いが異なるのでしょうか? 151:デフォルトの名無しさん 09/02/22 20:10:18 lambda x, i=i: i*x 152:デフォルトの名無しさん 09/02/22 20:27:38 >>150 Pythonでもクロージャは環境をキャプチャするんだが そのforループではiが逐次破壊的に書き換えられてしまう (let束縛ではなくset!のイメージ)んでそういう動作になる 単一代入でない&クロージャをサポートする言語で破壊的なループを使って そういう書き方をすると、そういう動作になるのが普通で、 JavaScriptやPerlなんかもそうなったはず Pythonでは>>151のような方法で対処できるが、魔術的だと感じられるなら ループの中でさらにdefで明示的にブロックを作って、その中で クロージャを作ったりするといいと思うよ
次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
レスジャンプ
mixiチェック!
Twitterに投稿
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch
5400日前に更新/114 KB
担当:undef