- ru
- Language: en
- 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'