Простори імен. Області видимості змінних¶
- Простір імен (namespace) - це словник імена (як рядки): значення.
- Область видимості (scope) визначає, які простори імен будуть переглядатися та в якому порядку.
Коли ви створюєте змінну, наприклад a = 1
, ви змінюєте простір імен. Коли ви
звертаєтесь до змінної, наприклад print(a)
, Python переглядає список просторів
імен, щоб спробувати знайти той, у якому ім'я є ключем.
Область видимості будь-якого посилання завжди починається з локального простору імен і просувається назовні, доки не досягне глобального простору імен модуля, а потім переходить до вбудованих елементів.
Область видимості визначає, де доступна змінна. Область видимості змінної залежить від місця її створення.
Найчастіше мова буде про дві області видимості:
- глобальної - змінні, які визначені поза функцією
- локальної – змінні, які визначені всередині функції
Використовуючи імена змінних у програмі, Python кожного разу шукає, створює або змінює ці імена у відповідному просторі імен. Простір імен, який доступний у кожний момент, залежить від області, де знаходиться код.
Пошук змінних¶
Під час пошуку змінних Python використовує правило LEGB. Наприклад, якщо всередині функції виконується звернення до імені змінної, Python шукає змінну в такому порядку за областями видимості (до першого збігу):
- L (local) - у локальній (всередині функції)
- E (enclosing) - у локальній області видимості вміщуючих функцій (це ті функції, всередині яких знаходиться наша функція)
- G (global) - у глобальній (в скрипті)
- B (built-in) - у вбудованій (зарезервовані значення Python)
Локальні та глобальні змінні¶
Локальні змінні:
- змінні, визначені всередині функції
- ці змінні стають недоступними після виходу з функції
Глобальні змінні:
- змінні, які визначені поза функцією
- ці змінні "глобальні" лише в межах модуля, щоб вони були доступні в іншому модулі, їх треба імпортувати
Приклад локальної змінної intf_config:
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 недоступна за межами функції. Для того щоб отримати результат функції, потрібно викликати функцію та присвоїти результат у змінну: