Установка переменных с помощью 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() словарь всегда должен обновлять соответствующую глобальную переменную, и наоборот.

Другие вопросы по тегам