Quelle est la différence entre les fonctions imbriquées et les fermetures en Python ?

DDD
Libérer: 2024-11-23 02:32:10
original
964 Les gens l'ont consulté

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

Fonctions imbriquées et fermetures en Python

Bien que les fonctions imbriquées en Python ressemblent superficiellement à des fermetures, elles sont fondamentalement distinctes en raison d'une différence clé :

Fonctions imbriquées comme Non-fermetures

Les fonctions imbriquées en Python ne sont pas considérées comme des fermetures car elles ne répondent pas à l'exigence suivante :

  • Elles n'accèdent pas aux variables locales aux étendues englobantes lorsque exécuté en dehors du champ d'application englobant.

Considérez ce qui suit exemple :

def make_printer(msg):
    def printer():
        print(msg)
    return printer
Copier après la connexion

Ici, la fonction imprimante est une fonction imbriquée dans make_printer. Il s'agit d'une fermeture car elle fait référence à la variable locale msg après le retour de make_printer.

Définition de la fermeture

Une fermeture est une fonction qui maintient une référence à une portée englobante, lui permettant d'accéder à des variables qui ne sont pas définies dans sa propre portée. Cette référence est conservée même après la sortie de la portée englobante.

Fonction imbriquée sans fermeture

D'autre part, la fonction imbriquée suivante, qui utilise une valeur par défaut valeur du paramètre, n'est pas une fermeture :

def make_printer(msg):
    def printer(msg=msg):
        print(msg)
    return printer
Copier après la connexion

Dans ce cas, la variable msg est liée à la valeur par défaut lors de la création de l'imprimante, et il ne fait référence à aucune variable en dehors de sa propre portée. Par conséquent, ce n'est pas une fermeture.

Conclusion

Les fonctions imbriquées en Python qui ne répondent pas à la définition de fermeture sont communément appelées « fonctions imbriquées » pour les distinguer à partir de véritables fermetures. Les fermetures peuvent être utiles pour conserver l'état des portées englobantes, tandis que les fonctions imbriquées sans fermeture encapsulent simplement la fonctionnalité dans une portée lexicale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal