Если вы читаете переменную, Python ищет ее во всей цепочке областей видимости.Это означает, что:
GLOB_VAR = "Some string"
def some_fun():
print GLOB_VAR
напечатает Some string
Теперь, если вы пишете в переменную, Python ищет ее в локальной области, и если он не может найти переменную симя, которое вы дали на локальном уровне, затем оно создает его.
Это означает, что в вашем примере вы создали переменную с именем SOME_VARIABLE
local для вашей функции some_fun
вместо обновления глобальной SOME_VARIABLE
.Это классическая ошибка Python.
Если вы хотите писать в свой глобальный объект, вы должны явно указать Python, что вы говорите о глобальной переменной, которая уже существует.Для этого вам нужно использовать ключевое слово global
.Итак, следующее:
GLOB_VAR = "Some string"
def some_fun():
global GLOB_VAR
GLOB_VAR = "Some other string"
some_fun()
print GLOB_VAR
напечатает Some other string
.
Примечание: Я считаю, что это способ побудить людей хранить глобальные переменные только для чтения илихотя бы подумать о том, что они делают .
Поведение такое же (чуть более удивительно), когда вы пытаетесь сначала прочитать, а затем записать в глобальный файл.Следующее:
GLOB_VAR = False
def some_fun():
if GLOB_VAR:
GLOB_VAR = False
some_fun()
будет повышаться:
Traceback (most recent call last):
File "t.py", line 7, in <module>
some_fun()
File "t.py", line 4, in some_fun
if GLOB_VAR:
UnboundLocalError: local variable 'GLOB_VAR' referenced before assignment
, поскольку, поскольку мы изменим GLOB_VAR
, оно считается локальной переменной.
Обновление: Эли Бендерский имеет подробное сообщение об этом, которое стоит прочитать для более формальных деталей.