Что означает ошибка UnboundLocalError: local variable referenced before assignment

Одна из самых частых ошибок у начинающих в Python.

Что означает ошибка UnboundLocalError: local variable referenced before assignment

Ситуация: вы пишете простую программу на Python, которая что-то считает по заданному алгоритму. Сначала всё идёт как обычно: объявляется глобальная переменная x, потом делаем новую функцию и обращаемся внутри неё к этой переменной:

x = 10
def sum():
x = x + 5
print(x)

Но при запуске этой функции командой sum() компьютер выдаёт ошибку:

Traceback (most recent call last):
File «main.py», line 6, in
sum()
File «main.py», line 3, in sum
x = x + 5
❌ UnboundLocalError: local variable ‘x’ referenced before assignment

Что это значит: Python ожидает, что x внутри функции будет локальной переменной. Соответственно, он ищет, где она объявляется в функции. А она не объявлена. Python падает с ошибкой.

Когда встречается: когда программист забыл про области видимости переменных или не использовал команду global.

Что делать с ошибкой UnboundLocalError: local variable referenced before assignment

Главное — определиться с областью видимости и решить, какую переменную вы хотите использовать: локальную или глобальную.

Если вам нужна локальная переменная, то её нужно добавить внутрь функции. Имя переменной при этом может совпадать с именем такой же глобальной переменной, но она никак на неё не повлияет. В этом случае нужно в функцию добавить строку x = <значение>, например:

x = 10
def sum():
    x = 11
    x = x + 5
    # выводим сумму с локальной переменной = 16
    print(x)
    
sum()
# выводим значение глобальной переменной
# оно не поменялось и равно 10
print(x)

Если мы хотим внутри функции работать с глобальной переменной, то её также нужно добавить в функцию командой global. После этого всё, что мы сделаем внутри функции с этой переменной, будет влиять и на значение глобальной переменной. Работает это так:

x = 10
def sum():
    global x
    x = x + 5
    # выводим сумму с глобальной переменной = 15
    print(x)
    
sum()
# выводим значение глобальной переменной
# оно поменялось и равно 15
print(x)

Редактура:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Олег Вешкурцев

Вам может быть интересно
$ is not defined в jQuery: что это значит и что делать
$ is not defined в jQuery: что это значит и что делать
medium
ReferenceError: math is not defined — что это означает
ReferenceError: math is not defined — что это означает

Противная и неочевидная ошибка, которую очень легко исправить.

medium
Uncaught SyntaxError: Unexpected end of input — что это значит?
Uncaught SyntaxError: Unexpected end of input — что это значит?

Скорее всего, вы забыли закрыть скобки при объявлении функции.

easy
Анализ текста: последняя часть
Анализ текста: последняя часть

Смотрим на существительные, прилагательные и глаголы у Толстого

easy
Как добавить интерактивную карту на сайт
Как добавить интерактивную карту на сайт

Задача на три минуты

easy
Красивые ссылки на вашем сайте
Красивые ссылки на вашем сайте

Меняем стандартное подчёркивание на дизайнерское.

medium
Делаем свой текстовый редактор с автосохранением
Делаем свой текстовый редактор с автосохранением

Это не так сложно, как звучит.

medium
Как сделать цикл без цикла?
Как сделать цикл без цикла?

Разбираем очередной вопрос из собеседований

easy
Пишем свой первый API c помощью FastAPI
Пишем свой первый API c помощью FastAPI

Создаём код, который возвращает данные с сервера

hard
easy