У меня есть глобальная переменная, которую я назвал 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 является локальной переменной?
Вы пропустили строку global Y_VAL
внутри функции.
Когда Y_VAL
встречается в правой части присваивания, это не проблема, потому что сначала выполняется поиск в локальной области видимости, а затем в глобальной. Однако с левой стороны вы можете присвоить глобалу только тогда, когда вы явно объявили глобальный Y_VAL
.
Из документации:
Невозможно присвоить глобальную переменную без глобальной, хотя свободные переменные могут ссылаться на глобальные, не будучи объявленными глобальными.
Это просто то, как работает Python: Присвоение всегда связывает левостороннее имя в ближайшем окружающем пространстве имен. Внутри функции ближайшим пространством имен является локальное пространство имен функции.
Чтобы присвоить глобальной переменной, вы должны объявить ее глобальной
. Но всеми силами избегайте global
. Глобальные переменные - это почти всегда плохой дизайн, и поэтому использование ключевого слова global
является сильным намеком на то, что вы допускаете ошибки в дизайне.