Что такое область видимости в Python?

В Python, область видимости определяет, где в коде можно получить доступ к переменной. Существует несколько типов:
  • Локальная (Local): Внутри функции.
  • Окружающая (Enclosing): Во вложенных функциях.
  • Глобальная (Global): На уровне модуля.
  • Встроенная (Built-in): Предопределенные имена Python.
Python ищет переменные в этих областях в порядке LEGB.

Область видимости (scope) в Python определяет контекст, в котором имя переменной доступно и может быть использовано. Это своеобразный "контейнер" для переменных, определяющий, где они могут быть найдены и изменены.

В Python существует четыре основных типа областей видимости (LEGB):

  • Local (Локальная): Определяется внутри функции. Переменные, объявленные внутри функции, доступны только внутри этой функции. После завершения работы функции они уничтожаются.
  • Enclosing function locals (Объемлющая функция): Если функция определена внутри другой функции (вложенная функция), внутренняя функция имеет доступ к переменным, объявленным в области видимости внешней функции.
  • Global (Глобальная): Определяется на уровне модуля (то есть вне каких-либо функций или классов). Переменные, объявленные в глобальной области видимости, доступны из любой части модуля.
  • Built-in (Встроенная): Содержит предопределенные имена, такие как имена встроенных функций (например, print(), len()) и констант (например, True, False, None). Эти имена доступны в любой части программы.

Порядок поиска переменных определяется правилом LEGB: Python сначала ищет переменную в локальной области видимости, затем в объемлющей функции, затем в глобальной области видимости и, наконец, в встроенной области видимости. Если переменная не найдена ни в одной из этих областей, возникает ошибка NameError.

Ключевые слова global и nonlocal:

  • global: Используется для указания, что переменная, используемая внутри функции, является глобальной переменной, определенной вне функции. Это позволяет функции изменять значение глобальной переменной.
  • nonlocal: Используется для указания, что переменная, используемая внутри вложенной функции, находится в области видимости объемлющей функции, но не является глобальной. Это позволяет вложенной функции изменять значение переменной в объемлющей функции.

Пример:

    
      x = 10 # Глобальная переменная

      def outer_function():
          y = 20 # Переменная в объемлющей функции

          def inner_function():
              nonlocal y
              y = 30  # Изменяем переменную y в объемлющей функции
              print("inner:", y) # Вывод: inner: 30

          inner_function()
          print("outer:", y) # Вывод: outer: 30

      outer_function()
      print("global:", x) # Вывод: global: 10
    
  

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

0