Impact de l'exec sur les variables locales: une plongée dans
la fonction exec, un aliment de base de python pour l'exécution du code dynamique, pose une requête complémentaire: Peut-il mettre à jour les variables locales dans une fonction?
Le dilemma Python 3
Dans Python 3, l'extrait de code suivant ne parvient pas à mettre à jour une variable locale comme on pourrait s'y attendre:
def f(): a = 1 exec("a = 3") print(a)
au lieu du «3» prévu, il imprime alarmante '1'!
Le comportement python 2
Curiété, le Python 2 Le même code dans Python 2 mettrait en jour la variable locale, l'impression «3». Cette disparité résulte d'un changement fondamental dans la façon dont Python gère les variables locales.
Le dilemme des locaux
Contrairement à Python 2, Python 3 stocke les variables locales dans un tableau gelé optimisé optimisé optimisé, Python 3 stocke les variables locales dans un tableau fréquen au moment de la compilation. Cette efficacité se fait au prix d'interdire les modifications d'exécution aux habitants. Ainsi, l'appel EXEC par défaut dans Python 3 ne peut pas modifier avec succès les variables locales.
La magie des locaux ()
pour contourner cette limitation et mettre à jour les variables locales, il faut Passez explicitement un dictionnaire local à l'exec. Ce dictionnaire stockera les variables locales mises à jour après l'exécution du code dynamique. Le code révisé ressemble à ceci:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
implications pour exec ()
La documentation Python 3 met en garde explicitement à la modification du dictionnaire Locals () par défaut tout en utilisant Exec, car cela peut conduire à comportement imprévisible. Pour la sécurité, il faut toujours transmettre un dictionnaire local explicite à EXEC lorsqu'il a l'intention de mettre à jour les variables locales.
Les curieuses optimisations de Python
Georg Brandl's Insightful Commentaires sur le Python Le rapport de bogues souligne que l'optimisation de Python 3 pour les variables locales a conduit au comportement actuel. Le compilateur, incapable de distinguer les fonctions EXEC personnalisées de Python, ne peut pas leur offrir un traitement spécial. Par conséquent, l'exécutif par défaut ne peut pas modifier les locaux.
exception de Python 2
Dans Python 2, l'ancienne instruction Exec a fonctionné différemment. Il a permis à des variables locales d'être modifiées dynamiquement en vertu de la gestion spéciale du compilateur de l'exécutif intégré.
Conclusion
L'appel Exec dans Python 3 nécessite un subtil subtil Changement d'approche pour modifier les variables locales. En utilisant un dictionnaire des locaux explicites, les développeurs peuvent tirer parti de la puissance de l'exécution du code dynamique tout en maintenant le contrôle de leurs variables locales.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3