Comment les variables locales ne peuvent pas être mises à jour directement avec exec
L'appel exec en Python est un outil puissant pour exécuter du code de manière dynamique, mais il comporte des limitations concernant la modification des variables locales.
Considérez ce qui suit code :
def f(): a = 1 exec("a = 3") print(a) f()
On pourrait s'attendre à ce que ce code imprime 3, mais il imprime en réalité 1. En effet, dans Python 3, les variables locales ne sont pas stockées dans un dictionnaire, mais dans un tableau avec des indices déterminés lors de la compilation. temps. La fonction exec ne peut pas modifier en toute sécurité les variables locales sans interférer avec cette optimisation.
Solution : Utiliser le dictionnaire local avec exec
Pour modifier les variables locales à l'aide de exec, vous devez pour transmettre explicitement un dictionnaire local. Par exemple :
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
Cela exécute le code dans le dictionnaire local (ldict), qui est distinct du tableau de variables locales de la fonction. La variable modifiée peut ensuite être renvoyée dans la portée de la fonction en accédant au dictionnaire local.
Comportement Python 2
Dans Python 2, exec pouvait modifier les variables locales sans passer un dictionnaire explicite car il traitait les espaces de noms qui utilisaient exec sans arguments globals/locals comme « non optimisés ». Cependant, ce n'est pas le cas dans Python 3.
Par conséquent, il est important de se rappeler que lors de l'utilisation de exec, les variables locales ne peuvent être mises à jour qu'en créant et en passant un dictionnaire local pour éviter tout conflit potentiel avec les optimisations du compilateur. .
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!