Назад к вопросам
Junior
76
questionbank
Какие существуют области видимости в Python?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Python существуют следующие области видимости (scopes):
- Local (L): Наиболее внутренняя область, относится к текущей функции или классу. Переменные, определенные внутри функции, доступны только внутри этой функции.
- Enclosing (E): Область видимости объемлющих функций. Переменные, определенные в внешней функции, доступны из внутренних (вложенных) функций, которые находятся внутри внешней.
- Global (G): Область видимости модуля. Переменные, определенные на верхнем уровне модуля, доступны в любой точке этого модуля.
- Built-in (B): Самая внешняя область видимости, содержит встроенные функции, типы и константы Python (например,
print(),len(),True). Эти элементы доступны без явного импорта.
Python ищет переменные в областях видимости в порядке LEGB: сначала в Local, затем в Enclosing, после в Global и, наконец, в Built-in.
# Global scope
global_var = "Я глобальная переменная"
def outer_function():
# Enclosing scope
enclosing_var = "Я переменная объемлющей функции"
def inner_function():
# Local scope
local_var = "Я локальная переменная"
print(f"Внутренняя функция:")
print(f" Local: {local_var}") # Доступ к локальной переменной
print(f" Enclosing: {enclosing_var}") # Доступ к переменной объемлющей функции
print(f" Global: {global_var}") # Доступ к глобальной переменной
print(f" Built-in: {len([1, 2])}") # Доступ к встроенной функции
inner_function()
outer_function()
print(f"\nГлобальная область:")
print(f" Global: {global_var}") # Доступ к глобальной переменной
# print(enclosing_var) # Ошибка: переменная не видна в глобальной области
# print(local_var) # Ошибка: переменная не видна в глобальной области
Ключевые слова global и nonlocal используются для изменения поведения работы с областями видимости при присвоении значений:
global: Позволяет изменять переменную в глобальной области видимости изнутри функции.nonlocal: Позволяет изменять переменную в ближайшей объемлющей (не глобальной) области видимости изнутри вложенной функции.
global_var_mod = "Начальное глобальное значение"
def modify_scopes():
enclosing_var_mod = "Начальное объемлющее значение"
def inner_modify():
global global_var_mod # Объявляем, что хотим изменить глобальную переменную
nonlocal enclosing_var_mod # Объявляем, что хотим изменить объемлющую переменную
global_var_mod = "Измененное глобальное значение"
enclosing_var_mod = "Измененное объемлющее значение"
local_var_mod = "Локальное значение" # Это новая локальная переменная
print(f"Внутри inner_modify:")
print(f" Global: {global_var_mod}")
print(f" Enclosing: {enclosing_var_mod}")
inner_modify()
print(f"Внутри modify_scopes (после inner_modify):")
print(f" Enclosing: {enclosing_var_mod}") # Видно измененное объемлющее значение
modify_scopes()
print(f"В глобальной области (после modify_scopes):")
print(f" Global: {global_var_mod}") # Видно измененное глобальное значение