The Python Programming Guide

Области видимости переменных

Область видимости (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