Области видимости переменных
Область видимости (scope) определяет контекст для переменной, в границах которого она может использоваться или переприсваиваться.
Глобальная область видимости
Переменная, которая была создана в основном теле кода, считается в Python глобальной переменной и относится к глобальной области видимости. Глобальные переменные доступны из любой другой области видимости.
Пример:
x = 5
def func():
print(x)
func()
print(x)
5
5
Функция func
выводит значение переменной x
, которая была определена вне функции как глобальная.
Коллизия имён переменных
Если в коде используется переменная с одним и тем же названием внутри и снаружи функции, то Python будет это считать две различные переменные, т.е одна определена вне тела функции (в глобальной области видимости), а вторая внутри.
Пример:
x = 5
def func():
x = 11
print(x)
func()
print(x)
11
5
Использование global
Для того чтобы создать или переприсвоить глобальную переменную в локальной области видимости, нужно использовать ключевое слово global
на этой переменной:
x = 5
def func():
global x
x = 11
print(x)
func()
print(x)
11
11
В таком случае переменная x
будет считаться Python’ом одной и той же переменной.
Локальная область видимости
Переменная, созданная внутри тела функции, принадлежит локальной области видимости данной функции и может быть использована только внутри нее:
def func():
x = 11
print(x)
func()
11
Если попытаться получить значение переменной x
вне функции, то будет вызвана ошибка:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Вложенные функции
Локальная область видимости аналогично работает и для вложенных функций. Однако внутри самой вложенной функции можно использовать переменные из внешней функции:
def func():
x = 5
def inner_func():
print(x)
inner_func()
func()
5
Пример с использованием переменной с тем же именем во вложенной функции:
def func():
x = 5
def inner_func():
x = 11
print(x)
inner_func()
print(x)
func()
11
5
Использование nonlocal
С помощью ключевого слова nonlocal
можно указать Python, чтобы использовалась переменная из внешнего окружения (не включая глобальную область видимости):
def func():
x = 5
def inner_func():
nonlocal x
x = 11
print(x)
inner_func()
print(x)
func()
11
11