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