共有スコープ変数による Lambda 関数の予期しない動作を回避するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-19 17:25:30
オリジナル
166 人が閲覧しました

How to Avoid Unexpected Behavior in Lambda Functions Due to Shared Scope Variables?

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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!