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'
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'])
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!