Пространство имен Python и область действия переменной

В этом руководстве вы узнаете о пространстве имен, отображении имен на объекты и области действия переменной.

Что такое имя в 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

Что происходит в указанной выше последовательности шагов? Давайте объясним это на диаграмме:

Схема памяти переменных в Python

Первоначально создается объект 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()т. Д., Всегда доступны нам из любой части программы. Каждый модуль создает свое собственное глобальное пространство имен.

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

Модули могут иметь различные функции и классы. При вызове функции создается локальное пространство имен, в котором определены все имена. То же самое и с классом. Следующая диаграмма может помочь прояснить эту концепцию.

Схема различных пространств имен в Python

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

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

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

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

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

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

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

Пример области действия и пространства имен в 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.

Интересные статьи...