Python のネストされた関数とクロージャの違いは何ですか?

DDD
リリース: 2024-11-23 02:32:10
オリジナル
963 人が閲覧しました

What's the Difference Between Nested Functions and Closures in Python?

Python の入れ子関数とクロージャ

Python の入れ子関数は表面的にはクロージャに似ていますが、次のような重要な違いにより根本的に異なります。

ネストされた関数非クロージャ

Python のネストされた関数は、次の要件を満たしていないため、クロージャとみなされません:

  • これらの関数は、次の場合に、外側のスコープに対してローカルな変数にアクセスしません。囲んでいるスコープの外で実行されます。

次のことを考慮してください。例:

def make_printer(msg):
    def printer():
        print(msg)
    return printer
ログイン後にコピー

ここで、プリンター関数は make_printer 内のネストされた関数です。これは、make_printer が戻った後にローカル変数 msg を参照するため、クロージャです。

クロージャの定義

クロージャは、外側のスコープへの参照を維持する関数です。独自のスコープ内で定義されていない変数にアクセスできるようになります。この参照は、外側のスコープが終了した後でも維持されます。

非閉鎖ネスト関数

一方、次のネスト関数はデフォルトを使用します。パラメータ値はクロージャではありません:

def make_printer(msg):
    def printer(msg=msg):
        print(msg)
    return printer
ログイン後にコピー

この場合、変数 msg はデフォルト値にバインドされますプリンターが作成されるとき、プリンターは独自のスコープ外の変数を参照しません。したがって、これはクロージャではありません。

結論

クロージャの定義を満たさない Python の入れ子関数は、区別するために一般に「入れ子関数」と呼ばれます。純正クロージャから。クロージャは、外側のスコープの状態を保持するのに役立ちますが、非クロージャのネストされた関数は単に字句スコープ内の機能をカプセル化します。

以上がPython のネストされた関数とクロージャの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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