Пространство имён и область видимости в Python

Проще говоря, пространство имён — это набор имён.

В Python мы можем представить пространство имён как отображение каждого определённого имени на соответствующие объекты.

Оно используется для хранения значений переменных и других объектов в программе и для связывания их с определённым именем.

Это позволяет нам использовать одно и то же имя для разных переменных или объектов в разных частях вашего кода, не вызывая конфликтов или путаницы.


Типы пространств имён в Python

Пространство имён, содержащее все встроенные имена, создаётся при запуске интерпретатора Python и существует столько, сколько работает интерпретатор.

По этой причине встроенные функции, такие как id(), print() и т. д., всегда доступны нам из любой части программы. Каждый модуль создаёт своё собственное глобальное пространство имён.

Эти разные пространства имён изолированы. Следовательно, одно и то же имя, которое может существовать в разных модулях, не конфликтует.

Модули могут иметь различные функции и классы. Локальное пространство имён создаётся при вызове функции, оно содержит все определённые в ней имена.

Аналогично обстоит дело с классом. Следующая диаграмма может помочь прояснить эту концепцию.

Пространства имён Python

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

Хотя определены различные уникальные пространства имён, мы не сможем получить доступ ко всем из них из каждой части программы. В игру вступает концепция области видимости.

Область видимости — это часть программы, из которой пространство имён может быть доступно напрямую без префикса.

В любой данный момент существует как минимум три вложенные области видимости.

  1. Область видимости текущей функции, которая имеет локальные имена

  2. Область видимости модуля, которая имеет глобальные имена

  3. Самая внешняя область видимости, которая имеет встроенные имена

Когда ссылка делается внутри функции, имя ищется в локальном пространстве имён, затем в глобальном пространстве имён и, наконец, во встроенном пространстве имён.

Если есть функция внутри другой функции, новая область видимости вложена внутрь локальной области видимости.


Пример 1: Область видимости и пространство имён в Python

# global_var находится в глобальном пространстве имён
global_var = 10

def outer_function():
    #  outer_var находится в локальном пространстве имён
    outer_var = 20

    def inner_function():
        #  inner_var находится во вложенном локальном пространстве имён
        inner_var = 30

        print(inner_var)

    print(outer_var)

    inner_function()

# печать значения глобальной переменной
print(global_var)

# вызов внешней функции и печать локальной и вложенной локальной переменных
outer_function()

Вывод

10
20
30

В приведённом выше примере есть три отдельных пространства имён: глобальное пространство имён, локальное пространство имён внутри внешней функции и локальное пространство имён внутри внутренней функции.

Здесь,

  • global_var — находится в глобальном пространстве имён со значением 10

  • outer_val — находится в локальном пространстве имён outer_function() со значением 20

  • inner_val — находится во вложенном локальном пространстве имён inner_function() со значением 30

При выполнении кода сначала печатается глобальная переменная global_var, затем локальные переменные outer_var и inner_var, когда вызываются внешняя и внутренняя функции.


Пример 2: Использование ключевого слова global в Python

# определение глобальной переменной
global_var = 10

def my_function():
    # определение локальной переменной
    local_var = 20

    # изменение значения глобальной переменной
    global global_var
    global_var = 30

# печать значения глобальной переменной
print(global_var)

# вызов функции и изменение глобальной переменной
my_function()

# печать изменённого значения глобальной переменной
print(global_var)

Вывод

10
30

Здесь, когда вызывается функция, ключевое слово global используется для указания, что global_var является глобальной переменной, и её значение изменяется на 30.

Поэтому при выполнении кода сначала печатается global_var со значением 10, затем вызывается функция и глобальная переменная изменяется на 30 изнутри функции.

И, наконец, изменённое значение global_var печатается снова.