← Назад к вопросам
В чем разница между локальной и глобальной переменной?
1.0 Junior🔥 291 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Локальные vs Глобальные переменные
Это фундаментальная концепция scope (области видимости) в Python. Область видимости определяет, где можно использовать переменную.
Глобальная переменная
global_var = 100 # Доступна везде в модуле
def function1():
print(global_var) # 100 — может читать
def function2():
print(global_var) # 100 — может читать
function1()
function2()
print(global_var) # 100 — доступна на уровне модуля
Характеристики глобальной переменной:
- Объявлена на уровне модуля
- Видна во всех функциях и классах модуля
- Существует в течение всего выполнения программы
- Изменение влияет на все, кто её использует
Локальная переменная
def function():
local_var = 50 # Существует только внутри функции
print(local_var)
function() # 50
print(local_var) # NameError: переменная не существует
Характеристики локальной переменной:
- Объявлена внутри функции
- Видна только в той функции
- Создаётся при вызове функции
- Уничтожается при выходе из функции
Проблема: Чтение и запись
count = 0
def increment():
print(count) # Может читать глобальную переменную
increment() # OK: 0
count = 0
def increment():
count = count + 1 # UnboundLocalError!
print(count)
increment()
Почему ошибка? Python видит присваивание (count = ...) и рассматривает count как локальную. Но в выражении count + 1 левая часть (count) ещё не определена.
Решение: Keyword global
count = 0
def increment():
global count # Указываем: используй глобальную!
count = count + 1
print(count)
increment() # 1
increment() # 2
print(count) # 2
Когда использовать global:
- Нужно изменить глобальную переменную внутри функции
- Указывается в начале функции
Nested функции и LEGB
Python ищет переменные по правилу LEGB:
global_var = "Global"
def outer():
enclosing_var = "Enclosing"
def inner():
local_var = "Local"
print(local_var)
print(enclosing_var)
print(global_var)
inner()
outer()
LEGB порядок поиска:
- Local — локальная переменная
- Enclosing — в охватывающей функции
- Global — в модуле
- Built-in — встроенные (len, print)
Nonlocal: для Enclosing scope
def outer():
count = 0
def inner():
nonlocal count
count += 1
print(count)
inner() # 1
inner() # 2
print(count) # 2
outer()
Best Practices
- Избегай глобальных переменных — используй параметры
- Используй локальные переменные — быстрее и безопаснее
- Классы вместо глобалов — лучший паттерн
- Явно указывай scope — с global и nonlocal
Резюме
- Глобальная — доступна везде в модуле
- Локальная — видна только в функции
- LEGB — порядок поиска переменных
- Лучшая практика — минимизируй глобальные переменные