Установка переменных с помощью exec внутри функции
Я только начал самостоятельно учить Python, и мне нужно немного помочь с этим сценарием:
old_string = "didnt work"
new_string = "worked"
def function():
exec("old_string = new_string")
print(old_string)
function()
Я хочу получить это так old_string = "worked"
,
2 ответа
Ты почти там. Вы пытаетесь изменить глобальную переменную, поэтому вы должны добавить global
заявление:
old_string = "didn't work"
new_string = "worked"
def function():
exec("global old_string; old_string = new_string")
print(old_string)
function()
Если вы запустите следующую версию, вы увидите, что произошло в вашей версии:
old_string = "didn't work"
new_string = "worked"
def function():
_locals = locals()
exec("old_string = new_string", globals(), _locals)
print(old_string)
print(_locals)
function()
выход:
didn't work
{'old_string': 'worked'}
То, как вы его запустили, вы попытались изменить локальные переменные функции в exec
, что в основном неопределенное поведение. Смотрите предупреждение в exec
документы:
Примечание. Местные жители по умолчанию действуют так, как описано для функции.
locals()
ниже: модификация словаря местных жителей по умолчанию не должна предприниматься. Передайте явный словарь местных жителей, если вам нужно увидеть влияние кода на местных жителей после функцииexec()
возвращается.
и соответствующее предупреждение о locals()
:
Примечание: содержание этого словаря не должно быть изменено; изменения могут не повлиять на значения локальных и свободных переменных, используемых интерпретатором.
Как альтернативный способ иметь exec
обновить ваши глобальные переменные внутри функции, чтобы передать globals()
внутрь.
>>> def function(command):
... exec(command, globals())
...
>>> x = 1
>>> function('x += 1')
>>> print(x)
2
В отличие от locals()
, обновление globals()
словарь всегда должен обновлять соответствующую глобальную переменную, и наоборот.