Назад к вопросам
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}") # Видно измененное глобальное значение