En quoi le comportement de la fonction Exec diffère-t-il entre Python 2 et Python 3 ?

Linda Hamilton
Libérer: 2024-11-14 22:02:02
original
817 Les gens l'ont consulté

How Does Exec Function Behavior Differ Between Python 2 and Python 3?

Comportement de la fonction Exec dans Python 2 par rapport à Python 3

L'instruction exec présente des différences notables de comportement entre Python 2 et Python 3. En Python 2, exec a agi comme une instruction, modifiant efficacement les variables locales dans la portée de la fonction.

Cependant, dans Python 3, exec() devient une fonction. Cela empêche la modification des variables locales à l'intérieur des fonctions, bien que cela soit possible dans Python 2. De plus, même les variables déclarées précédemment ne sont pas modifiables.

La fonction locals() permet uniquement la mise à jour unilatérale des variables locales. Par exemple, dans le code Python 2 suivant :

def foo():
    a = 'spam'
    locals()['a'] = 'ham'
    print(a)              # prints 'spam'
Copier après la connexion

L'affectation de 'ham' à locals()['a'] n'affecte pas la valeur de la variable 'a' dans la fonction, et 'spam' reste imprimé.

Dans Python 2, exec a explicitement copié les variables trouvées dans locals() dans la fonction locals à l'aide de PyFrame_LocalsToFast. Cependant, dans Python 3, ce comportement n'est plus possible.

Pour obtenir le comportement souhaité dans Python 3, il faut utiliser un nouvel espace de noms (par exemple, un dictionnaire) lors de l'appel exec(). Cela peut être vu dans le code Python 3 suivant :

def execute(a, st):
    namespace = {}
    exec("b = {}\nprint('b:', b)".format(st), namespace)
    print(namespace['b'])
Copier après la connexion

La documentation exec() indique explicitement les limitations imposées à l'utilisation de locals() :

"Remarque : les locaux par défaut agissent comme décrit pour la fonction locals() ci-dessous : il ne faut pas tenter de modifier le dictionnaire de locaux par défaut. Transmettez un dictionnaire de locaux explicite si vous avez besoin de voir les effets du code sur les locaux après le retour de la fonction exec()."

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal