ホームページ  >  記事  >  バックエンド開発  >  入れ子になった Python 関数が実際にクロージャされるのはいつですか?

入れ子になった Python 関数が実際にクロージャされるのはいつですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-24 03:30:09480ブラウズ

When Are Nested Python Functions Actually Closures?

Python の入れ子関数: クロージャを使用しない理由

Python の入れ子関数は、他の関数内で関数を定義できるようにする機能です。これらの関数は、それを囲んでいるスコープから変数を継承し、それ以外の場合はアクセスできない変数へのアクセスを提供します。

クロージャとの類似点があるにもかかわらず、Python の入れ子関数はクロージャとは呼ばれません。この違いは彼らの行動に由来します。クロージャは、スコープが終了した後でも、外側のスコープから変数にアクセスできる関数です。

入れ子になった関数が Python で定義されている場合、本質的に、その外側のスコープの変数へのアクセスは保持されません。 。代わりに、ネストされた関数は新しいスコープを作成し、そのスコープ内の変数にのみアクセスできます。

ネストされた関数がクロージャとして動作するには、次の 2 つの重要な基準を満たしている必要があります:

  1. それを囲んでいるスコープ内の変数を参照する必要があります。
  2. それを囲んでいるスコープの外で実行する必要がありますscope.

入れ子関数がこれらの条件を両方とも満たす場合、クロージャとして動作します。それ以外の場合、これは単なるネストされた関数です。

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

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

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

この例では、プリンター関数は、それを囲んでいるスコープ (make_printer) から msg 変数にアクセスします。これは、外側のスコープの外で実行されるため (プリンターに割り当てられてから呼び出されるとき)、クロージャとして動作します。

対照的に、外側のスコープから変数を参照しない入れ子関数は、クロージャとして動作しません。閉鎖。例:

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

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

ここでは、msg 変数は、それを囲んでいるスコープ内の変数ではなく、パラメーターのデフォルト値にバインドされています。したがって、このネストされた関数はクロージャではありません。

要約すると、Python のネストされた関数はクロージャとは呼ばれません。これは、Python のネストされた関数は、本質的にクロージャの動作 (終了後に外側のスコープから変数にアクセスする) を示さないためです。 。クロージャとして認定するには、ネストされた関数は、それを囲んでいるスコープから変数を参照することと、そのスコープの外で実行されることの両方が必要です。

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

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