• en
  • Language: ru
  • Documentation version: latest

Пространства имен. Области видимости

У переменных в Python есть область видимости. В зависимости от места в коде, где переменная была определена, определяется и область видимости, то есть, где переменная будет доступна.

При использовании имен переменных в программе, Python каждый раз ищет, создает или изменяет эти имена в соответствующем пространстве имен. Пространство имен, которое доступно в каждый момент, зависит от области, в которой находится код.

У Python есть правило LEGB, которым он пользуется при поиске переменных.

Например, если внутри функции выполняется обращение к имени переменной, Python ищет переменную в таком порядке по областям видимости (до первого совпадения):

  • L (local) - в локальной (внутри функции)

  • E (enclosing) - в локальной области объемлющих функций (это те функции, внутри которых находится наша функция)

  • G (global) - в глобальной (в скрипте)

  • B (built-in) - во встроенной (зарезервированные значения Python)

Соответственно, есть локальные и глобальные переменные:

  • локальные переменные:

    • переменные, которые определены внутри функции

    • эти переменные становятся недоступными после выхода из функции

  • глобальные переменные:

    • переменные, которые определены вне функции

    • эти переменные „глобальны“ только в пределах модуля

    • например, чтобы они были доступны в другом модуле, их надо импортировать

Пример локальной intf_config:

In [1]: def configure_intf(intf_name, ip, mask):
   ...:     intf_config = f'interface {intf_name}\nip address {ip} {mask}'
   ...:     return intf_config
   ...:

In [2]: intf_config
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-5983e972fb1c> in <module>
----> 1 intf_config

NameError: name 'intf_config' is not defined

Обратите внимание, что переменная intf_config недоступна за пределами функции. Для того чтобы получить результат функции, надо вызвать функцию и присвоить результат в переменную:

In [3]: result = configure_intf('F0/0', '10.1.1.1', '255.255.255.0')

In [4]: result
Out[4]: 'interface F0/0\nip address 10.1.1.1 255.255.255.0'