Maison >développement back-end >Tutoriel Python >Quand les fonctions Python imbriquées sont-elles réellement des fermetures ?

Quand les fonctions Python imbriquées sont-elles réellement des fermetures ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 03:30:09538parcourir

When Are Nested Python Functions Actually Closures?

Fonctions imbriquées en Python : pourquoi pas des fermetures ?

Les fonctions imbriquées en Python sont une fonctionnalité qui permet de définir des fonctions au sein d'autres fonctions. Ces fonctions héritent des variables de leur portée englobante, donnant accès à des variables qui seraient autrement hors de portée.

Malgré le partage de similitudes avec les fermetures, les fonctions imbriquées en Python ne sont pas appelées fermetures. Cette distinction découle de leur comportement. Une fermeture est une fonction qui a accès aux variables d'une portée englobante même après la sortie de cette portée.

Lorsqu'une fonction imbriquée est définie en Python, elle ne conserve pas intrinsèquement l'accès aux variables de sa portée englobante. . Au lieu de cela, la fonction imbriquée crée une nouvelle portée et a accès aux variables de cette portée uniquement.

Pour qu'une fonction imbriquée se comporte comme une fermeture, elle doit répondre à deux critères clés :

  1. Il doit référencer une variable dans sa portée englobante.
  2. Il doit être exécuté en dehors de sa portée englobante. scope.

Si une fonction imbriquée satisfait à ces deux conditions, elle se comporte comme une fermeture. Sinon, il s'agit simplement d'une fonction imbriquée.

Considérons l'exemple suivant :

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

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

Dans cet exemple, la fonction imprimante accède à la variable msg à partir de sa portée englobante (make_printer). Parce qu'elle est exécutée en dehors de sa portée englobante (lorsqu'elle est affectée à l'imprimante puis appelée), elle se comporte comme une fermeture.

En revanche, une fonction imbriquée qui ne fait pas référence aux variables de sa portée englobante n'est pas une fermeture. Par exemple :

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

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

Ici, la variable msg est liée à la valeur par défaut du paramètre au lieu de la variable dans la portée englobante. Par conséquent, cette fonction imbriquée n'est pas une fermeture.

En résumé, les fonctions imbriquées en Python ne sont pas appelées fermetures car elles ne présentent pas intrinsèquement le comportement des fermetures, qui accèdent aux variables à partir d'une portée englobante après sa sortie. . Pour être considérée comme une fermeture, une fonction imbriquée doit à la fois faire référence à des variables de sa portée englobante et être exécutée en dehors de celle-ci.

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!

Déclaration:
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