В этом руководстве вы узнаете о пространстве имен, отображении имен на объекты и области действия переменной.
Что такое имя в Python?
Если вы когда-нибудь читали «Дзен Python» (введите import this
текст в интерпретаторе Python), последняя строка гласит: « Пространства имен - отличная идея - давайте сделаем больше! Так что же это за загадочные пространства имен? Давайте сначала посмотрим, что такое имя.
Имя (также называемое идентификатором) - это просто имя, данное объектам. Все в Python - это объект. Имя - это способ доступа к базовому объекту.
Например, когда мы выполняем присваивание a = 2
, 2
это объект, хранящийся в памяти, и имя, с которым мы его связываем. Мы можем получить адрес (в ОЗУ) некоторого объекта с помощью встроенной функции 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
Что происходит в указанной выше последовательности шагов? Давайте объясним это на диаграмме:
![](https://cdn.wiki-base.com/9138309/python_namespace_and_scope_of_a_variable.jpg.webp)
Первоначально создается объект 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)
Все они действительны и будут относиться к трем различным типам объектов в разных случаях. Функции тоже являются объектами, поэтому имя также может относиться к ним.
def printHello(): print("Hello") a = printHello a()
Вывод
Здравствуйте
То же имя a может относиться к функции, и мы можем вызывать функцию, используя это имя.
Что такое пространство имен в Python?
Теперь, когда мы понимаем, что такое имена, мы можем перейти к концепции пространств имен.
Проще говоря, пространство имен - это набор имен.
В Python вы можете представить себе пространство имен как отображение каждого определенного вами имени на соответствующие объекты.
В определенный момент времени могут сосуществовать разные пространства имен, но они полностью изолированы.
Пространство имен, содержащее все встроенные имена, создается при запуске интерпретатора Python и существует, пока интерпретатор работает.
Это причина того, что встроенные функции, такие как id()
и print()
т. Д., Всегда доступны нам из любой части программы. Каждый модуль создает свое собственное глобальное пространство имен.
Эти разные пространства имен изолированы. Следовательно, одно и то же имя, которое может существовать в разных модулях, не противоречит.
Модули могут иметь различные функции и классы. При вызове функции создается локальное пространство имен, в котором определены все имена. То же самое и с классом. Следующая диаграмма может помочь прояснить эту концепцию.
![](https://cdn.wiki-base.com/9138309/python_namespace_and_scope_of_a_variable_2.jpg.webp)
Область видимости переменной Python
Несмотря на то, что определены различные уникальные пространства имен, мы не сможем получить доступ ко всем из них из каждой части программы. В игру вступает концепция объема.
Область видимости - это часть программы, из которой можно получить доступ к пространству имен без какого-либо префикса.
В любой момент существует как минимум три вложенных области видимости.
- Область действия текущей функции, имеющей локальные имена
- Область действия модуля, имеющего глобальные имена
- Самая внешняя область видимости со встроенными именами
Когда ссылка делается внутри функции, имя ищется в локальном пространстве имен, затем в глобальном пространстве имен и, наконец, во встроенном пространстве имен.
Если внутри другой функции есть функция, новая область вложена в локальную область.
Пример области действия и пространства имен в Python
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
Здесь переменная a находится в глобальном пространстве имен. Переменная b находится в локальном пространстве имен, outer_function()
а c находится во вложенном локальном пространстве имен inner_function()
.
Когда мы внутри inner_function()
, c локально для нас, b нелокально, а a глобально. Мы можем читать, а также назначать новые значения для c, но можем читать только b и a из 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)
Как видите, вывод этой программы
а = 30 а = 20 а = 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)
Результат программы -.
а = 30 а = 30 а = 30
Здесь все ссылки и назначения относятся к глобальному a из-за использования ключевого слова global
.