«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Обновляется ли `exec ()` локальные переменные в Python 3, а если нет, то как это можно сделать?

Обновляется ли `exec ()` локальные переменные в Python 3, а если нет, то как это можно сделать?

Опубликовано в 2025-02-19
Просматривать:399

Does `exec()` Update Local Variables in Python 3, and If Not, How Can It Be Made To?

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