次のスクリプトを実行すると、両方のラムダがos.startfile()を同じファイル(junk.txt)で実行します。それぞれのラムダがラムダが作成されたときに設定された値 "f"の使用を期待しています。私が期待するようにこれを機能させる方法はありますか?関数が呼び出されたときにPythonのクロージャが期待どおりに動作しない
def main():
files = [r'C:\_local\test.txt', r'C:\_local\junk.txt']
funcs = []
for f in files:
# create a new lambda and store the current `f` as default to `path`
funcs.append(lambda path=f: os.stat(path))
print funcs
# calling the lambda without a parameter uses the default value
funcs[0]()
funcs[1]()
そうでない場合f
が見上げているので、あなたは、現在の(ループの後)の値を取得:
import os
def main():
files = [r'C:\_local\test.txt', r'C:\_local\junk.txt']
funcs = []
for f in files:
funcs.append(lambda: os.startfile(f))
print funcs
funcs[0]()
funcs[1]()
if __name__ == '__main__':
main()
と同様の[pythonでラムダ式のループを生成する](http://stackoverflow.com/questions/1841268/generating-functions-inside-loop-with-lambda-expression-in-python) – Rodrigue