locals().update(словарь) не добавляет все переменные

Я загружаю переменные с помощью объектов словаря, но значения обновляются. Что мне здесь не хватает?

assert "run_LMM" in all_variables.keys()
locals().update(all_variables)
assert "run_LMM" in locals()

В последней строке я получаю ошибку утверждения. В чем дело?


person Steve Zelaznik    schedule 13.06.2014    source источник


Ответы (1)


Это ожидаемое поведение согласно документам:

Содержимое этого словаря не должно изменяться; изменения не могут повлиять на значения локальных и свободных переменных, используемых интерпретатором.

Я думаю, одна из причин этого заключается в том, что во время компиляции функции определяется, является ли переменная глобальной или локальной, так что в:

def func():
    locals()['val'] = 1
    print val

последний оператор всегда читает из глобальной переменной, так как локальная переменная не объявлена. Таким образом, возможность динамически добавлять местных жителей усложнила бы жизнь.

person bereal    schedule 13.06.2014
comment
@CharlieParker Я так не думаю. Каков ваш вариант использования? - person bereal; 17.10.2017
comment
мой вариант использования - воспроизвести функцию загрузки Matlab mathworks.com/help/matlab /ref/load.html , просто легко и аккуратно загрузите переменные в пространство имен. - person Charlie Parker; 17.10.2017
comment
@CharlieParker нет, это определенно невозможно, вам понадобится какой-то объект или словарь, который будет служить пространством имен. - person bereal; 17.10.2017
comment
зачем нужен дикт посередине, чтобы работать как пространство имен? это та часть, которую я не понимаю, вещи уже сброшены в python (в словарь), почему бы просто не поместить их в настоящий словарь пространства имен, которое Python использует в любом случае. Зачем добавлять эту дополнительную структуру данных посередине? - person Charlie Parker; 17.10.2017
comment
Первая причина в том, что, как я упоминал в ответе, список локальных переменных определяется во время компиляции функции, чтобы сделать возможной оптимизацию доступа. Во-вторых, и это более важно, Python является универсальным языком программирования, а динамическое создание локальных переменных представляет собой потенциальную проблему для статических контролеров, специалистов по сопровождению и т. д. В-третьих, как говорится в Python, явное лучше, чем неявное. - person bereal; 17.10.2017
comment
последний вопрос. Интуитивно, как предварительная компиляция функции делает работу более эффективной? В каком смысле он более эффективен и почему? Спасибо за помощь. :) - person Charlie Parker; 17.10.2017
comment
Я думаю, что на этот вопрос есть несколько очень хороших ответов, объясняющих именно это. - person bereal; 17.10.2017