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はローカル変数としてキャプチャされ、ループが完了するとその値が保存されます。その結果、コールバック関数が実行されると、正しい値が印刷され、予想される出力が表示されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3