Lambda 関数でのパラメーター変更による予期しない結果を回避する方法

Patricia Arquette
リリース: 2024-10-19 17:28:01
オリジナル
684 人が閲覧しました

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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

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