← Назад к вопросам

Какие знаешь области видимости?

1.0 Junior🔥 191 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Области видимости в Python

Области видимости (scope) определяют, где переменная доступна. Python использует LEGB правило.

LEGB правило

# L - Local (локальная)
# E - Enclosing (охватывающая)
# G - Global (глобальная)
# B - Built-in (встроенная)

def outer():
    x = 'enclosing'  # E
    
    def inner():
        x = 'local'  # L
        print(x)  # local
    
    inner()
    print(x)  # enclosing

x = 'global'  # G
outer()
print(x)  # global

print(len)  # Built-in

Local (L)

def func():
    local_var = 'local'
    print(local_var)  # Доступна

func()
print(local_var)  # NameError: переменная не доступна

Enclosing (E)

def outer():
    enclosing_var = 'enclosing'
    
    def inner():
        print(enclosing_var)  # Доступна из inner
    
    inner()

outer()

Global (G)

global_var = 'global'

def func():
    print(global_var)  # Доступна

func()
print(global_var)  # Доступна

Built-in (B)

print(len)  # Built-in функция
print(str)  # Built-in класс
print(True)  # Built-in константа

global ключевое слово

x = 'global'

def func():
    global x
    x = 'changed'  # Меняет глобальную переменную

func()
print(x)  # changed

nonlocal ключевое слово

def outer():
    x = 'enclosing'
    
    def inner():
        nonlocal x
        x = 'changed'  # Меняет переменную из outer
    
    inner()
    print(x)  # changed

outer()

Замыкание (Closure)

def make_adder(x):
    def adder(y):
        return x + y  # Замыкание на x
    return adder

add5 = make_adder(5)
print(add5(10))  # 15
print(add5(20))  # 25

Область видимости в классах

class MyClass:
    class_var = 'class'
    
    def __init__(self):
        self.instance_var = 'instance'
    
    def method(self):
        local_var = 'local'
        print(self.instance_var)  # instance
        print(MyClass.class_var)   # class
        print(local_var)           # local

obj = MyClass()
obj.method()

Области видимости в модулях

# module.py
GLOBAL_VAR = 'global'

class MyClass:
    pass

# main.py
from module import GLOBAL_VAR, MyClass
print(GLOBAL_VAR)  # Доступна

import module
print(module.GLOBAL_VAR)  # Доступна

Тень переменных (Variable shadowing)

x = 'global'

def func():
    x = 'local'  # Затеняет глобальный x
    print(x)  # local

func()
print(x)  # global (не изменился)

Время жизни переменной

def func():
    x = 'local'  # Создаётся при вызове
    print(x)
    # x удаляется после выхода из функции

func()
func()

class MyClass:
    class_var = []  # Живёт столько же, сколько класс
    
    def method(self):
        self.instance_var = 'instance'  # Живёт столько же, сколько объект

Глобальные переменные в функциях

global_var = 0

def increment():
    global global_var
    global_var += 1

increment()
increment()
print(global_var)  # 2

Лучшие практики

# ❌ Избегай глобальных переменных
global_state = []

def add_item(item):
    global_state.append(item)  # Плохо

# ✅ Передавай через аргументы
def add_item(state, item):
    return state + [item]

# ❌ Избегай тени переменных
x = 'global'
if True:
    x = 'local'  # Confusing

# ✅ Используй разные имена
x = 'global'
if True:
    x_local = 'local'

# ✅ Используй классы для состояния
class State:
    def __init__(self):
        self.data = []

state = State()

Вывод: Области видимости — важны для понимания, где доступна переменная. LEGB правило помогает разобраться в приоритетах поиска переменной.

Какие знаешь области видимости? | PrepBro