「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Lambda 関数でのパラメーター変更による予期しない結果を回避する方法

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

2024 年 11 月 18 日に公開
ブラウズ:402

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

Lambda 関数のスコープとそのパラメータ

Lambda 関数は、それを囲んでいる関数のスコープをキャプチャできる匿名関数です。これにより、親スコープから変数やパラメーターにアクセスできるようになります。ただし、ラムダ関数が周囲の関数内で変更されたパラメーターを使用する場合、この動作により予期しない結果が生じることがあります。

この問題を説明するには、次のコードを考えてみましょう:

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()

このコードの予想される出力は次のとおりです:

do
re
mi

ただし、実際の出力は次のようになります:

mi
mi
mi

これは、ラムダ関数が外側のスコープから変数 m への参照をキャプチャするためです。反復子がループを実行すると、最後の反復で値 'mi' が m に割り当てられます。その結果、作成中に異なる値が渡されたとしても、すべてのラムダ関数は実行時に 'mi' への参照を持ちます。

この問題を解決するには、次の場所で m の値を取得できます。オプションのパラメーターのデフォルト値として使用するラムダ関数の作成時間:

for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))

これにより、各 lambda 関数が m の独自のコピーにアクセスし、ループの反復中に割り当てられた値をキャプチャできるようになります。このコードの出力は次のようになります:

do
re
mi
リリースステートメント この記事は次の場所に転載されています: 1729329919 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3