Lambda 関数のスコープとそのパラメータ
Lambda 関数は、それを囲んでいる関数のスコープをキャプチャできる匿名関数です。これにより、親スコープから変数やパラメーターにアクセスできるようになります。ただし、ラムダ関数が周囲の関数内で変更されたパラメーターを使用する場合、この動作により予期しない結果が生じることがあります。
問題を説明するには、次のコードを考えてみましょう。
<code class="python">def callback(msg): print(msg) # Creating a list of function handles with an iterator funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) # Calling the lambda functions for f in funcList: f()</code>
予想されるこのコードの出力は次のとおりです:
do re mi
ただし、実際の出力は次のとおりです:
mi mi mi
これは、ラムダ関数が外側のスコープから変数 m への参照をキャプチャするためです。反復子がループを実行すると、最後の反復で値 'mi' が m に割り当てられます。その結果、作成中に異なる値が渡されたとしても、すべてのラムダ関数は実行時に「mi」への参照を持ちます。
この問題を解決するには、次の場所で m の値をキャプチャできます。オプションのパラメーターのデフォルト値として使用するラムダ関数の作成時:
<code class="python">for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))</code>
これにより、各ラムダ関数が m の独自のコピーにアクセスできるようになり、作成中に割り当てられた値がキャプチャされます。ループの繰り返し。このコードの出力は次のようになります:
do re mi
以上がLambda 関数でのパラメーター変更による予期しない結果を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。