ホームページ > バックエンド開発 > Python チュートリアル > Python Lambda 関数クロージャは実際にどのような変数をキャプチャしますか?

Python Lambda 関数クロージャは実際にどのような変数をキャプチャしますか?

DDD
リリース: 2024-12-29 06:55:14
オリジナル
355 人が閲覧しました

What Variables Do Python Lambda Function Closures Actually Capture?

Python Lambda 関数クロージャは何をキャプチャしますか?

Python ラムダ関数クロージャを使用する場合、そのキャプチャ動作を理解することが重要です。クロージャは、クロージャ内で使用される変数の値を、それを囲んでいるスコープからキャプチャします。ただし、このキャプチャが行われる方法は驚くべきものになる可能性があります。

これを説明するために、次のコードを考えてみましょう。

adders = [None, None, None, None]

for i in [0, 1, 2, 3]:
    adders[i] = lambda a: i + a

print(adders[1](3))
ログイン後にコピー

このコードでは、次のラムダ関数のリストを作成します。単一の入力に定数値を追加します。定数値は、関数の作成時に最初に i の値に設定されます。しかし、クロージャのリストを検査すると、驚くべきことに、それらはすべて i の最終値を参照しており、予期しない出力 6 が得られることがわかります。

この動作は、クロージャが i の値をキャプチャするという事実から生じます。参照ではなく変数。その結果、クロージャの作成後に i の値が変更された場合、クロージャは最後にキャプチャされた値を参照し続けます。

現在の値のキャプチャ

i の現在値を調べるには、「ダミー パラメーター」テクニックとして知られるトリックを使用できます。キャプチャしたい変数と同じ名前のパラメータを宣言し、その変数のデフォルト値を指定することで、クロージャに現在の値を強制的にキャプチャさせます。

for i in [0, 1, 2, 3]:
    adders[i] = lambda a, i=i: i + a  # <-- Note the dummy parameter with a default value

print(adders[1](3))  # Output: 4
ログイン後にコピー

この手法では、クロージャは作成時に i の値をキャプチャし、その後の i への変更がクロージャの動作に影響を与えないようにします。

以上がPython Lambda 関数クロージャは実際にどのような変数をキャプチャしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート