Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

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

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

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

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

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

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

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

<час>

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

  1. Ключевые слова и идентификаторы Python
  2. Оператор Python, отступы и комментарии
  3. Переменные Python, константы и литералы
  4. Преобразование типов Python и приведение типов
  5. Ввод, вывод и импорт Python
  6. Операторы Python
  7. Глобальные, локальные и нелокальные переменные Python
  8. Числа Python, преобразование типов и математика
  9. Управление каталогами и файлами Python
  10. Ошибки Python и встроенные исключения