Назад к вопросам
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()