Что означает ошибка 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)

Редактура:

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

Художник:

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

Корректор:

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

Вёрстка:

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

Соцсети:

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

Вам может быть интересно
Uncaught SyntaxError: Unexpected end of input — что это значит?
Uncaught SyntaxError: Unexpected end of input — что это значит?

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

easy
ReferenceError: math is not defined — что это означает
ReferenceError: math is not defined — что это означает

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

medium
$ is not defined в jQuery: что это значит и что делать
$ is not defined в jQuery: что это значит и что делать
medium
Асинхронный код на Python: синтаксис и особенности
Асинхронный код на Python: синтаксис и особенности

Асинхронность — это когда функции выполняются вместе, но не одновременно

hard
Считаем способы, как подняться по лестнице
Считаем способы, как подняться по лестнице

Очередная задачка с собеседования

easy
Своя игра: создаём собственную «Змейку»
Своя игра: создаём собственную «Змейку»

Работы на 10 минут, а удовольствия на целый день.

medium
Космическая Python-программа: следим за МКС
Космическая Python-программа: следим за МКС

Всё легально и в открытом доступе

easy
Bomberman на JavaScript
Bomberman на JavaScript

Как на старой приставке из детства.

hard
Красиво делимся итогами года
Красиво делимся итогами года

Подводим их как настоящие программисты

medium
easy