ホームページ >バックエンド開発 >Python チュートリアル >共有スコープ変数による Lambda 関数の予期しない動作を回避するにはどうすればよいですか?
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)) # Executing the functions for f in funcList: f()</code>
期待される出力は次のとおりです:
do re mi
ただし、実際の出力は次のようになります。
mi mi mi
これは、ラムダ関数が作成されたときに、それを囲むスコープ内に共有変数 m への参照が保持されるために発生します。ラムダ関数が実行されるまでに、m は 'mi' に再割り当てされ、予期しない出力が発生します。
この問題を解決するには、デフォルト値を持つオプションのパラメーターを使用できます。これにより、各ラムダ関数が変数の独自の値をキャプチャできるようになります。
<code class="python">for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))</code>
この変更により、各ラムダ関数は作成時に m の値の個別のコピーを維持し、目的の出力を生成します。 :
do re mi
以上が共有スコープ変数による Lambda 関数の予期しない動作を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。