Перейти до змісту

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

  • Простір імен (namespace) - це словник імена (як рядки): значення.
  • Область видимості (scope) визначає, які простори імен будуть переглядатися та в якому порядку.

Коли ви створюєте змінну, наприклад a = 1, ви змінюєте простір імен. Коли ви звертаєтесь до змінної, наприклад print(a), Python переглядає список просторів імен, щоб спробувати знайти той, у якому ім'я є ключем.

Область видимості будь-якого посилання завжди починається з локального простору імен і просувається назовні, доки не досягне глобального простору імен модуля, а потім переходить до вбудованих елементів.

Область видимості визначає, де доступна змінна. Область видимості змінної залежить від місця її створення.

Найчастіше мова буде про дві області видимості:

  • глобальної - змінні, які визначені поза функцією
  • локальної – змінні, які визначені всередині функції

Використовуючи імена змінних у програмі, Python кожного разу шукає, створює або змінює ці імена у відповідному просторі імен. Простір імен, який доступний у кожний момент, залежить від області, де знаходиться код.

Пошук змінних

Під час пошуку змінних Python використовує правило LEGB. Наприклад, якщо всередині функції виконується звернення до імені змінної, Python шукає змінну в такому порядку за областями видимості (до першого збігу):

  • L (local) - у локальній (всередині функції)
  • E (enclosing) - у локальній області видимості вміщуючих функцій (це ті функції, всередині яких знаходиться наша функція)
  • G (global) - у глобальній (в скрипті)
  • B (built-in) - у вбудованій (зарезервовані значення Python)

legb

Локальні та глобальні змінні

Локальні змінні:

  • змінні, визначені всередині функції
  • ці змінні стають недоступними після виходу з функції

Глобальні змінні:

  • змінні, які визначені поза функцією
  • ці змінні "глобальні" лише в межах модуля, щоб вони були доступні в іншому модулі, їх треба імпортувати

local_global

Приклад локальної змінної 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 недоступна за межами функції. Для того щоб отримати результат функції, потрібно викликати функцію та присвоїти результат у змінну:

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"