Почему Python думает, что это - локальная переменная?

У меня есть глобальная переменная, которую я назвал Y_VAL, который инициализируется к значению 2.

У меня затем есть функция, вызванная f () (для краткости), который использует Y_VAL.

def f():
    y = Y_VAL
    Y_VAL += 2

Однако при попытке выполнить мой код, Python дает сообщение об ошибке:

UnboundLocalError: local variable 'Y_VAL' referenced before assignment

Если я удаляю последнюю строку Y_VAL += 2 это хорошо работает.

Почему Python думает, что Y_VAL является локальной переменной?

5
задан Paul 13 July 2010 в 22:06
поделиться

2 ответа

Вы пропустили строку global Y_VAL внутри функции.

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

Из документации:

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

14
ответ дан 18 December 2019 в 11:52
поделиться

Это просто то, как работает Python: Присвоение всегда связывает левостороннее имя в ближайшем окружающем пространстве имен. Внутри функции ближайшим пространством имен является локальное пространство имен функции.

Чтобы присвоить глобальной переменной, вы должны объявить ее глобальной. Но всеми силами избегайте global. Глобальные переменные - это почти всегда плохой дизайн, и поэтому использование ключевого слова global является сильным намеком на то, что вы допускаете ошибки в дизайне.

1
ответ дан 18 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: