Комментарии (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 правило помогает разобраться в приоритетах поиска переменной.