Lambda 関数のスコープとそのパラメータ
Python では、ラムダ関数はインライン関数を定義するための短縮表記を提供します。ただし、次のコードに示すように、スコープとパラメータの処理によって予期しない動作が発生する可能性があります。
def callback(msg): print msg # Iterative Approach funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) for f in funcList: f() # Individual Creation funcList = [] funcList.append(lambda: callback('do')) funcList.append(lambda: callback('re')) funcList.append(lambda: callback('mi')) for f in funcList: f()
期待される出力は次のとおりです。
do re mi do re mi
ただし、実際の出力は次のとおりです。
mi mi mi do re mi
この動作は、ラムダ関数が外側のスコープから変数のコピーを作成しないという事実に起因します。代わりに、それらの変数への参照を維持します。その結果、ループ内での m の値の変更は、そのループ内で作成されたすべてのラムダ関数に影響します。
この問題を解決するには、ラムダ関数の作成時に m の値をキャプチャするのが一般的です。これをオプションのパラメーターのデフォルト引数として使用することで:
for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))
これにより、各ラムダ関数が m の正しい値を確実に取得し、目的の出力が得られます:
do re mi do re mi
以上がLambda 関数のスコープが Python での出力に影響するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。