ホームページ >バックエンド開発 >Python チュートリアル >Python クロージャと入れ子関数: 違いは何ですか?

Python クロージャと入れ子関数: 違いは何ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 00:47:09938ブラウズ

Python Closures vs. Nested Functions: What's the Difference?

Python のクロージャーと入れ子関数: 明確化

Python には「入れ子関数」として知られる概念があり、クロージャーとよく間違われます。この混乱に対処するために、Python 内のクロージャの本質を詳しく調べてみましょう。

クロージャは、外側のスコープが終了した後でも、そのスコープからローカル変数へのアクセスを維持する関数として定義されます。 Python では、入れ子になった関数が外側の関数からローカル変数を参照するときにクロージャが発生します。これらの変数は、入れ子になった関数からアクセスできるため、外側のスコープの外でもアクセスできます。

次の例を考えてみましょう。

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

printer = make_printer('Foo!')
printer()

このシナリオでは、関数 printer は参照しているためクロージャです。囲んでいる関数 make_printer からのローカル変数 msg。 make_printer が終了した後でも、msg はプリンターからアクセス可能なままです。

ただし、すべての入れ子関数がクロージャであるわけではありません。ネストされた関数がクロージャとして認定されるには、次の基準を満たす必要があります。

  • 外側のスコープのローカル変数にアクセスする
  • スコープ外で実行されるときにこれらの変数を参照する

ネストされた関数がこれらの要件を満たさない場合、それはクロージャではなく、通常のネストされた関数とみなされます。 function.

たとえば、次のコードを考えてみましょう:

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

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

ここで、ネストされた関数 printer は、外側の関数からの msg を参照しないため、クロージャではありません。代わりに、デフォルトのパラメータに値を割り当て、msg への外部アクセスの必要性を排除します。

したがって、Python でクロージャと入れ子関数を区別するには、入れ子関数が msg へのアクセスを維持しているかどうかを考慮することが重要です。後者の実行が完了した後でも、外側のスコープからのローカル変数。

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

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