Присвоение значения имени делает имя локальным, если имя явно не объявлено глобальным.
a = 12
def foo():
a = 42
print a # uses local
foo()
>>> 42
def foo():
global a
a = 42
foo()
print a
>>> 42
Если имя не назначено, оно является глобальным.
a = 12
def foo():
print a # uses global
foo()
>>> 12
Короче говоря, вам нужно только явно объявить имя глобальным, если вы будете присваивать ему имя. Если вы просто читаете из него, вы можете использовать его по своему желанию. Однако, если вы когда-либо назначите переменную, она будет считаться локальной в этой функции, если вы не объявили ее глобальной.
b = 5
def foo():
print b
b = 7
foo()
>>> ???
Поскольку b
назначено в foo()
и не объявлено глобальным, Python решает во время компиляции , что b
является локальным именем. Поэтому b
является локальным именем во всей функции, , включая в операторе print
перед присваиванием.
Следовательно, оператор print
выдает ошибку, поскольку локальное имя b
не было определено!