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 サイトの他の関連記事を参照してください。