Пространство имен и область действия Python
Пространство имен и область действия Python
В этом руководстве вы узнаете о пространстве имен, сопоставлении имен с объектами и области действия переменной.
Что такое имя в Python?
Если вы когда-либо читали «Дзен Python» (наберите import this
в интерпретаторе Python), последняя строка гласит:Пространства имен — это отличная идея — давайте сделаем больше таких! Так что же это за загадочные пространства имен? Давайте сначала посмотрим, что такое имя.
Имя (также называемое идентификатором) — это просто имя, данное объектам. Все в Python является объектом. Имя — это способ доступа к базовому объекту.
Например, когда мы выполняем присваивание a = 2
, 2
объект, хранящийся в памяти, и a это имя, с которым мы его ассоциируем. Мы можем получить адрес (в оперативной памяти) какого-либо объекта через встроенную функцию id()
. Давайте посмотрим, как его использовать.
# Note: You may get different values for the id
a = 2
print('id(2) =', id(2))
print('id(a) =', id(a))
Вывод
id(2) = 9302208 id(a) = 9302208
Здесь оба относятся к одному и тому же объекту 2
, поэтому они имеют одинаковый id()
. Давайте сделаем вещи немного интереснее.
# Note: You may get different values for the 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
Что происходит в приведенной выше последовательности шагов? Чтобы пояснить это, воспользуемся диаграммой:
<рисунок> Изначально объект 2
создается и имя a связан с ним, когда мы делаем a = a+1
, новый объект 3
создан и теперь a связан с этим объектом.
Обратите внимание, что id(a)
и id(3)
имеют одинаковые значения.
Кроме того, когда b = 2
выполнено, новое имя b связывается с предыдущим объектом 2
.
Это эффективно, поскольку Python не должен создавать новый дублирующийся объект. Этот динамический характер привязки имен делает Python мощным; имя может относиться к любому типу объекта.
>>> a = 5
>>> a = 'Hello World!'
>>> a = [1,2,3]
Все они действительны и a будет ссылаться на три разных типа объектов в разных экземплярах. Функции также являются объектами, поэтому к ним также может относиться имя.
def printHello():
print("Hello")
a = printHello
a()
Вывод
Hello
То же имя a может ссылаться на функцию, и мы можем вызвать функцию, используя это имя.
<час>Что такое пространство имен в Python?
Теперь, когда мы поняли, что такое имена, мы можем перейти к концепции пространств имен.
Проще говоря, пространство имен — это набор имен.
В Python вы можете представить пространство имен как сопоставление каждого имени, которое вы определили, с соответствующими объектами.
Различные пространства имен могут сосуществовать одновременно, но они полностью изолированы.
Пространство имен, содержащее все встроенные имена, создается при запуске интерпретатора Python и существует, пока работает интерпретатор.
По этой причине встроенные функции, такие как id()
, print()
и т.д. всегда доступны нам из любой части программы. Каждый модуль создает собственное глобальное пространство имен.
Эти разные пространства имен изолированы. Следовательно, одно и то же имя, которое может существовать в разных модулях, не конфликтует.
Модули могут иметь различные функции и классы. Локальное пространство имен создается при вызове функции, в которой определены все имена. Аналогично и в случае с классом. Следующая диаграмма может помочь прояснить эту концепцию.
<рисунок> <час>Область действия переменной Python
Несмотря на то, что определены различные уникальные пространства имен, мы не можем получить доступ ко всем из них из каждой части программы. В игру вступает понятие масштаба.
Область действия — это часть программы, из которой можно получить прямой доступ к пространству имен без каких-либо префиксов.
В любой момент существует как минимум три вложенных области.
- Область действия текущей функции с локальными именами
- Область действия модуля с глобальными именами
- Внешняя область со встроенными именами
Когда внутри функции делается ссылка, имя ищется в локальном пространстве имен, затем в глобальном пространстве имен и, наконец, во встроенном пространстве имен.
Если внутри другой функции есть функция, новая область вкладывается в локальную область.
<час>Пример области действия и пространства имен в Python
def outer_function():
b = 20
def inner_func():
c = 30
a = 10
Здесь переменная a находится в глобальном пространстве имен. Переменная b находится в локальном пространстве имен outer_function()
и с находится во вложенном локальном пространстве имен inner_function()
.
Когда мы находимся в inner_function()
, с является локальным для нас, b является нелокальным и a является глобальным. Мы можем читать, а также присваивать новые значения c но может только читать b и а из inner_function()
.
Если мы попытаемся присвоить значение b , новая переменная b создается в локальном пространстве имен, отличном от нелокального b . То же самое происходит, когда мы присваиваем значение a .
Однако, если мы объявим a как глобальный, все ссылки и назначения идут в глобальный a . Точно так же, если мы хотим повторно связать переменную b , он должен быть объявлен как нелокальный. Следующий пример еще больше пояснит это.
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 = 30 a = 20 a = 10
В этой программе три разные переменные a определены в отдельных пространствах имен и доступны соответственно. В следующей программе
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 = 30 a = 30 a = 30
Здесь все ссылки и назначения относятся к глобальному a из-за использования ключевого слова global
.
Python
- Ключевые слова и идентификаторы Python
- Оператор Python, отступы и комментарии
- Переменные Python, константы и литералы
- Преобразование типов Python и приведение типов
- Ввод, вывод и импорт Python
- Операторы Python
- Глобальные, локальные и нелокальные переменные Python
- Числа Python, преобразование типов и математика
- Управление каталогами и файлами Python
- Ошибки Python и встроенные исключения