Что означает ошибка 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
Прокачиваем телеграм-бота: пишем полноценный бэкенд
Прокачиваем телеграм-бота: пишем полноценный бэкенд

Часть 2: продолжаем работать с бэкендом для пользы дела

medium
Прокачиваем собственный текстовый редактор
Прокачиваем собственный текстовый редактор
medium
Библиотека Pandas в Python и что с ней можно делать
Библиотека Pandas в Python и что с ней можно делать

Инструмент анализа наборов данных

easy
Домашнее видеонаблюдение на Raspberry Pi
Домашнее видеонаблюдение на Raspberry Pi
hard
Что означает ошибка FileNotFoundError: [Errno 2] No such file or directory
Что означает ошибка FileNotFoundError: [Errno 2] No such file or directory

Когда скрипт не может найти нужный файл

easy
Запускаем свой сайт на движке Publii
Запускаем свой сайт на движке Publii

Он работает на компьютере даже без интернета

easy
easy