Пространства имён и области видимости переменных в Python: Понимание имён, связывания и областей
Пространства имён и области видимости переменных в Python
Изучите, как работают имена, пространства имён и области видимости переменных в Python, с понятными примерами и лучшими практиками.
Что такое имя в Python?
В «The Zen of Python» (import this) последняя строка гласит: «Namespaces are one honking great idea -- let's do more of those!» Но что такое пространства имён? Сначала определим имя.
Имя, или идентификатор, — это ярлык, ссылающийся на объект. В Python всё — объект, и имя даёт удобный способ доступа к нему.
Например, при выполнении a = 2 целое число 2 сохраняется в памяти, а a становится его ссылкой. Встроенная функция id() возвращает адрес объекта в памяти.
# Ваши значения id могут отличаться
a = 2
print('id(2) =', id(2))
print('id(a) =', id(a))
Вывод
id(2) = 9302208 id(a) = 9302208
Оба имени указывают на один объект, поэтому их id() совпадают. Посмотрим, что происходит при пересвязывании a:
# Ваши значения id могут отличаться
a = 2
print('id(a) =', id(a))
a = a + 1
print('id(a) =', id(a))
print('id(3) =', id(3))
b = 2
print('id(b) =', id(b))
print('id(2) =', id(2))
Вывод
id(a) = 9302208 id(a) = 9302240 id(3) = 9302240 id(b) = 9302208 id(2) = 9302208
При выполнении a = a + 1 создаётся новый объект 3, и a теперь ссылается на него. Обратите внимание, что id(a) и id(3) идентичны. Последующее присваивание b = 2 просто связывает b с существующим объектом 2, избегая дублирования хранения.

Это динамическое связывание имён делает Python гибким: один идентификатор может указывать на значения любого типа — включая функции.
def printHello():
print("Hello")
a = printHello
a()
Вывод
Hello
Идентификатор a теперь ссылается на функцию printHello, которую можно вызывать напрямую.
Что такое пространство имён?
Пространство имён — отображение имён к объектам. Представьте его как словарь, содержащий каждый определённый идентификатор вместе с ассоциированным объектом.
Python поддерживает несколько пространств имён одновременно, каждое изолированное от других. Интерпретатор создаёт глобальное пространство имён со всеми встроенными именами, живущим всю сессию. Каждый модуль получает своё глобальное пространство имён, а каждое определение функции или класса вводит новое локальное пространство имён.

Область видимости переменных в Python
Пока пространства имён существуют, область видимости определяет, где имя доступно без квалификации.
В любой момент программа имеет как минимум три вложенных области видимости:
- Локальная область видимости текущей выполняемой функции.
- Глобальная область видимости модуля.
- Встроенная область видимости, всегда доступная.
Когда имя упоминается внутри функции, Python ищет в локальном пространстве имён сначала, затем в глобальном, и наконец во встроенном. Если функция содержит другую функцию, внутренняя вводит новую вложенную область видимости.
Пример: Взаимодействие области видимости и пространства имён
Рассмотрим следующий код:
def outer_function():
b = 20
def inner_func():
c = 30
a = 10
Здесь a живёт в глобальном пространстве имён модуля. Переменная b локальна для outer_function, а c принадлежит вложенному локальному пространству имён inner_func.
Внутри inner_func, c локальна, b — non-local, a — глобальна. Можно читать и писать c, но только читать b и a, если не объявить их явно с global или nonlocal.
Более конкретная иллюстрация:
def outer_function():
a = 20
def inner_function():
a = 30
print('a =', a)
inner_function()
print('a =', a)
a = 10
outer_function()
print('a =', a)
Вывод демонстрирует три разных связывания a:
a = 30 a = 20 a = 10
Чтобы заставить все присваивания касаться глобальной a, используйте ключевое слово global:
def outer_function():
global a
a = 20
def inner_function():
global a
a = 30
print('a =', a)
inner_function()
print('a =', a)
a = 10
outer_function()
print('a =', a)
Теперь вывод отражает единственную глобальную a:
a = 30 a = 30 a = 30
Эти примеры иллюстрируют, как правила пространств имён и областей видимости Python управляют видимостью и изменяемостью переменных.
Python
- Ключевые слова и идентификаторы в Python: мастерство зарезервированных слов и соглашений об именовании
- Операторы, отступы и комментарии в Python: понятное руководство
- Переменные, константы и литералы в Python — подробное руководство
- Мастерство преобразования типов в Python: Полное руководство
- Мастерство ввода-вывода и импорта модулей в Python: Практическое руководство
- Мастерство операторов Python: Полное руководство
- Глобальные, локальные и nonlocal переменные в Python: понимание и применение
- Числа, преобразование типов и математика в Python: полное руководство
- Управление директориями и файлами в Python: полное руководство
- Ошибки и встроенные исключения в Python: полное руководство