@Phys_Math_Man

Как работает locals() в python?

locals(), якобы, возвращает локальный словарь имен текущей области видимости. Но почему в области выполнения функции изменения этого словаря не отражаются на переменных:
def f():
    x = 1
    locals()['x'] = 2
    print(x)

f()                    # вывод: 1

def f():
    locals()['x'] = 2
    print(x)

f()                   # вывод: NameError: name 'x' is not defined

В случае globals(), например, все работает логично и предсказуемо.
Что вообще такое locals(), как он работает и для чего нужен?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Прежде всего, в pydoc-комментарии функции locals есть сноска о том, что синхронизация возвращённого функцией словаря с состоянием переменных не гарантируется и зависит от реализации. Конкретно в CPython в данный момент такой синхронизации не происходит потому, что locals получает значения переменных из фрейма стека, копирует в новый словарь и возвращает его. Сделано так, как ни парадоксально, для производительности.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ZhenyaMak
@ZhenyaMak
Писать качественный софт? Пфф, это не для меня.
Не шарю в питоне, но могу Предположить:
  • locals это локальный блок, можно обратиться через оператор [] к переменным "локальным", или же тем которые находятся в блоке где и вызван locals
  • ошибка вызвана из за того что переменная "x" Не объявлена в блоке вызова locals

Ответ написан
Комментировать
@Zzzz9
def f():
    x = 1
    y=0
    print(x)
    print(locals())

y=5
f()


1
{'x': 1, 'y': 0}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы