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

Lambda関数の範囲とループのパラメーターの予期しない動作を回避する方法は?

2025-03-24に投稿されました
ブラウズ:277

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops?

lambda関数とそのパラメーターの範囲

lambda関数。ただし、予期しない動作を避けるために、パラメータースコーピングを理解することは重要です。ループ内でlambda関数を使用するときに発生する一般的な問題を探りましょう。 MSGを印刷します #イテレーターを使用した誤ったアプローチ funclist = [] m in( 'do'、 're'、 'mi'): funclist.append(lambda:callback(m)) #正しいアプローチを一度に作成します funclist = [] funclist.append(lambda:callback( 'do')) funclist.append(lambda:callback( 're')) funclist.append(lambda:callback( 'mi')) #コールバック関数を実行します funclistのfの場合: f()

実行すると、コードは予期せず印刷されます: mi mi mi する 再 mi

予想出力の代わりに:

def callback(msg):
    print msg

# Incorrect approach using an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Correct approach creating one at a time
funcList = []
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))

# Execute the callback functions
for f in funcList:
    f()

説明
mi
mi
mi
do
re
mi

ラムダ関数とそのパラメーターの範囲を理解することがここで重要です。通常の機能とは異なり、ラムダ関数は、それらが作成されている周囲の環境を参照します。この参照には、ラムダの本体内で使用される変数が含まれます。

do
re
mi
do
re
mi

今、各lambda関数内で、mはローカル変数としてキャプチャされ、ループが完了するとその値が保存されます。その結果、コールバック関数が実行されると、正しい値が印刷され、予想される出力が表示されます。

リリースステートメント この記事には、侵害がある場合は1729329977に複製されています。[email protected]に連絡して削除してください。
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3