ホームページ >バックエンド開発 >Python チュートリアル >Python クロージャは入れ子関数とどう違うのでしょうか?

Python クロージャは入れ子関数とどう違うのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-24 18:15:131010ブラウズ

How Do Python Closures Differ From Nested Functions?

Python のクロージャ: 謎を明らかにする

入れ子関数は Python でよく見られるため、クロージャとの関係について疑問が生じます。これらはいくつかの特性を共有していますが、互換性はありません。

クロージャは、外側のスコープのローカル変数へのアクセスを、外側の関数が実行を完了した後でも保持する関数です。これにより、後でそれらの変数を利用できるようになります。

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

一方、ネストされた関数は、別の関数内で定義されますが、その関数を継承しません。デフォルトではローカル変数。これらは、外側のスコープからローカル変数を参照する場合にのみクロージャになります。ローカル変数を参照しないと、外側の関数の完了後にアクセスできなくなります。

Python でのクロージャの例:

def make_printer(msg):
    def printer():
        print(msg)
    return printer

printer = make_printer('Foo!')
printer()  # Output: Foo!

この例では、入れ子関数 printer は、囲み関数 make_printer からローカル変数 msg を参照します。 make_printer が戻ると、通常、msg はスコープ外になりますが、クロージャはそれへのアクセスを保持します。

外側のスコープ変数を参照しない入れ子関数におけるクロージャの不在:

入れ子関数が外側のスコープからローカル変数を参照しない場合、それはクロージャとみなされません。代わりに、独自のローカル変数を持つ通常の関数として動作します。

非クロージャーネスト関数の例:

def make_printer(msg):
    def printer(msg=msg):
        print(msg)
    return printer

printer = make_printer('Foo!')
printer()  # Output: Foo!

ここでは、 msg パラメータは入れ子関数プリンタで使用され、外部スコープから独立した独自のローカル変数を持つことが保証されます。したがって、これは閉鎖ではありません。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。