Назад к вопросам
Middle
64
questionbank

Как в Python осуществляется поиск переменной с учётом области видимости?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Python поиск переменной осуществляется по правилу LEGB.

  • Local (L): Проверяется текущая функция или метод.
  • Enclosing Function Locals (E): Проверяется область видимости объемлющей функции (для вложенных функций).
  • Global (G): Проверяется модуль, в котором находится код.
  • Built-in (B): Проверяется встроенная область видимости Python (функции типа len, print и т.д.).

Интерпретатор ищет имя переменной последовательно в этих областях видимости, начиная с локальной. Как только имя найдено, поиск прекращается. Если имя не найдено ни в одной из областей видимости, генерируется ошибка NameError.

# Global scope
x = 10

def outer_function():
    # Enclosing scope
    y = 20

    def inner_function():
        # Local scope
        z = 30
        print(x) # Находит x в Global scope
        print(y) # Находит y в Enclosing scope
        print(z) # Находит z в Local scope
        # print(non_existent) # Вызовет NameError

    inner_function()

outer_function()

Использование ключевых слов global и nonlocal позволяет изменять поведение поиска и присвоения:

  • global: Позволяет изменять переменную в глобальной области видимости из локальной.
  • nonlocal: Позволяет изменять переменную в объемлющей области видимости (но не глобальной) из вложенной функции.
# Global scope
a = 5

def func_global():
    global a # Указываем, что работаем с глобальной переменной a
    a = 15 # Изменяем глобальную переменную
    print(f"Inside func_global: a = {a}")

def func_nonlocal():
    b = 25 # Enclosing scope

    def inner_func_nonlocal():
        nonlocal b # Указываем, что работаем с переменной b из объемлющей области
        b = 35 # Изменяем переменную b в объемлющей области
        print(f"Inside inner_func_nonlocal: b = {b}")

    inner_func_nonlocal()
    print(f"Inside func_nonlocal: b = {b}")

func_global()
print(f"Outside: a = {a}")

func_nonlocal()