Exec на локальные переменные: Dive в
функция EXEC, основная часть питона для динамического выполнения кода, вызывает индивидуальный запрос: Может ли он обновить локальные переменные в функции? Dilemma
в Python 3, следующий фрагмент кода не может обновить локальную переменную, как можно ожидать:
def f (): a = 1 exec ("a = 3") print (a)вместо ожидаемого '3', он тревожно печатает '1'!
def f(): a = 1 exec("a = 3") print(a)
python 2 поведение
, с любопытством, любопытно, Тот же код в Python 2 действительно обновит локальную переменную, печать «3». Это несоответствие возникает из -за фундаментального изменения в том, как Python обрабатывает локальные переменные. во время компиляции. Эта эффективность достигается за счет запрета модификаций времени выполнения для местных жителей. Таким образом, вызов EXEC по умолчанию в Python 3 не может успешно изменить локальные переменные. Явно передайте словарь местных жителей Exec. Этот словарь будет хранить обновленные локальные переменные после выполнения динамического кода. Пересмотренный код выглядит следующим образом: ]
def foo (): ldict = {} exec ("a = 3", globals (), ldict) a = ldict ['a'] print (a)
для exc ()
документация Python 3 явно предостерегает от изменения словаря локалов по умолчанию () во время использования Exec, как это может привести к непредсказуемое поведение. Для обеспечения безопасности следует всегда передать явный словарь локалов в EXEC при намере обновлять локальные переменные.]
любопытные оптимизации Python
Georg Brandl's Comensial Comments на Python Отчет об ошибках подчеркивает, что оптимизация Python 3 для локальных переменных привела к текущему поведению. Компилятор, неспособный отличить пользовательские функции EXEC от собственного Python, не может предложить им специальную обработку. Следовательно, Exec по умолчанию не может изменить локальных жителей.
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
В Python 2 оператор Old Exec работал по -разному. Он позволил локальным переменным быть динамически изменять в силу специальной обработки компилятора встроенного Exec.
Заключение
вызов EXEC в Python 3 требует тонкого. Изменение подхода к изменению локальных переменных. Используя явный словарь местных жителей, разработчики могут использовать силу динамического выполнения кода, сохраняя при этом контроль над своими локальными переменными. ]
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3