Maison  >  Article  >  développement back-end  >  Comment la fonction « exec » se comporte-t-elle différemment dans Python 2 et Python 3 ?

Comment la fonction « exec » se comporte-t-elle différemment dans Python 2 et Python 3 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 15:07:01574parcourir

How does the `exec` function behave differently in Python 2 and Python 3?

Comportement de la fonction exec dans Python 2 et Python 3

La fonction exec présente un comportement distinct entre Python 2 et Python 3. Dans Python 2, exec est une instruction, tandis que dans Python 3, il est devenu une fonction. Cette distinction a des implications significatives pour son interaction avec les variables locales.

Comportement de Python 2

Dans Python 2, l'instruction exec permet la modification des variables locales dans la portée d'une fonction. Lorsque l'instruction exec est exécutée, le compilateur Python désactive temporairement les optimisations de portée locale et passe à une stratégie de recherche plus lente pour accéder aux variables locales et globales. De plus, toutes les variables déclarées dans l'instruction exec sont automatiquement copiées dans les paramètres locaux de la fonction si aucun paramètre global et local explicite n'est fourni.

Comportement de Python 3

Dans Python 3, l'exec() la fonction suit strictement les règles de portée de la fonction. Il ne peut plus modifier les variables dans la portée locale d'une fonction, même si elles ont été préalablement déclarées. Locals() est capable de refléter les variables locales dans une direction, mais autoriser les modifications via locals() n'a jamais été pris en charge.

Solution de contournement correcte

Pour obtenir le comportement souhaité observé dans Python 2, il est nécessaire d'utiliser un espace de noms distinct lors de l'appel à exec() dans Python 3. En transmettant un dictionnaire personnalisé à la fonction exec(), il est possible de modifier et d'accéder aux variables dans cet espace de noms.

Exemple de code

Le code suivant montre la bonne façon d'utiliser exec() dans Python 3 :

def execute(a, st):
    namespace = {}
    exec("b = {}\nprint('b:', b)".format(st), namespace)
    print(namespace['b'])

Cette approche garantit que la portée locale de la fonction reste intacte, tout en autorisant les modifications des variables dans le espace de noms défini.

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