Ошибка NameError: почему Python не знает имя и как это исправить

Ошибки Pythonобновлено 07.10.20269 мин чтенияесть тренажёр

NameError в Python — это ошибка неизвестного имени: программа обращается к переменной или функции, которой интерпретатор не знает. Причин всего пять: опечатка, другой регистр букв, переменная ещё не создана, текст без кавычек или имя, спрятанное внутри функции. Сообщение name '…' is not defined подсказывает, какое слово искать.

Загружаем…

Что значит NameError в Python

NameError в Python — это сообщение «я не знаю такого имени», которое появляется прямо во время работы программы. Строки до ошибки успевают выполниться, а на проблемной строке всё останавливается.

Имя в Python — это любое слово, которым мы что-то называем: переменная schet, функция print, модуль math. Python ведёт таблицу известных имён. Когда вы пишете schet = 0, имя попадает в таблицу. Когда используете schet в выражении, интерпретатор ищет его там. Не нашёл — выбрасывает NameError. Список встроенных исключений, включая этот, приведён в официальной документации Python[1]. Там NameError описан коротко: исключение возникает, когда локальное или глобальное имя не найдено.

Запустите программу в редакторе выше. В окне «Вывод» появится сообщение об ошибке, а ниже — подсказка на русском. Сравните имя из сообщения с тем, что записано в третьей строке, и вы сразу увидите разницу в одну букву.

Как выглядит сообщение name is not defined

Сообщение об ошибке имени занимает 4 строки: место в файле, строку кода, отметку под именем и последнюю строку с типом ошибки и самим неизвестным словом в кавычках.

ochki = 15
print("Очки:", ocki)
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    print("Очки:", ocki)
                   ^^^^
NameError: name 'ocki' is not defined. Did you mean: 'ochki'?

Главное здесь — слово в кавычках после name. Это ровно то, что вы написали, без исправлений. Python 3.10 и новее часто добавляют совет «Did you mean: …?» — похожее имя, которое он знает. Совет не всегда точен, но в случае опечатки почти всегда попадает. Формат такого сообщения не меняется от задачи к задаче: в любой версии, описанной в документации Python, там будут слова NameError и not defined. В редакторе на сайте текст может чуть отличаться: совета там может не быть, зато есть русская подсказка. Подробно о том, как разбирать такие сообщения сверху донизу, написано в статье про отладку программ.

Пять причин неизвестного имени

Неизвестное имя почти всегда объясняется одной из 5 причин. Таблица помогает быстро проверить их по очереди.

ПричинаПример с ошибкойИсправление
Опечатка в имениprint(resultat) при rezultat = 3Скопируйте имя из строки, где его создали
Другой регистр буквPrint("Привет"), trueprint, True
Имя использовано до созданияprint(x) выше строки x = 1Перенесите присваивание выше
Текст без кавычекprint(Привет)print("Привет")
Имя живёт внутри функциипеременная из def используется снаружиВерните значение через return
Модуль не подключёнmath.sqrt(9) без importДобавьте import math в начало

Все шесть случаев заканчиваются одной и той же NameError, хотя лечатся по-разному. Шестая строка таблицы — бонус: забытый import тоже даёт NameError, и свежий Python прямо спрашивает «Did you forget to import 'math'?».

Опечатка и регистр букв

Для Python imya, Imya и IMYA — это 3 разных имени. Регистр букв важен везде: в переменных, функциях и встроенных словах.

imya = input("Как тебя зовут? ")
Print("Привет,", Imya)

В этом коротком примере сразу две проблемы: Print с большой буквы и Imya вместо imya. Python сообщит только о первой, потому что на ней выполнение остановится. После исправления запустите снова — и появится вторая. Так работает любая ошибка времени выполнения: одна за раз.

Отдельная ловушка — латинские и русские буквы, которые выглядят одинаково. Переменная x, набранная в русской раскладке как «х», для Python совсем другое имя. Если слово в сообщении выглядит точно так же, как в коде, а ошибка не уходит, сотрите имя целиком и наберите его заново в английской раскладке. Чтобы не путаться, руководство PEP 8 рекомендует писать имена переменных маленькими буквами через подчёркивание — kolichestvo_yablok, а не KolichestvoYablok[2]. Одна система для всех имён — и регистр перестаёт быть угадайкой. Ещё PEP 8 советует не называть переменные одиночными буквами l, O и I: их легко спутать с цифрами 1 и 0.

Переменная используется до создания

Python выполняет программу сверху вниз, строка за строкой. Если переменная создаётся на строке 5, то на строке 3 её ещё не существует.

print("Итого:", summa)
summa = 120 + 80

Человек видит обе строки одновременно и понимает замысел. Python же читает первую строку, ищет summa — и не находит. Исправление — поменять строки местами:

summa = 120 + 80
print("Итого:", summa)

Хитрее случай, когда переменная создаётся внутри условия, которое не сработало. Если otvet = "много" стоит в теле if x > 10:, а x равен 5, присваивание просто пропускается, и print(otvet) ниже упадёт. Похожее бывает с циклом, который не выполнился ни разу: for i in range(0) не создаст ни одной переменной из своего тела. Надёжное правило — задавать начальное значение до условия или цикла: otvet = "мало", а потом при необходимости менять его. Подробнее о создании и изменении значений — в уроке про переменные в Python.

Слово без кавычек

Текст в Python всегда заключают в кавычки. Слово без кавычек интерпретатор считает именем переменной и пытается найти его значение.

print(Молодец)

Здесь хотели вывести слово, а получили NameError: name 'Молодец' is not defined. Python разрешает русские буквы в именах, поэтому не ругается на синтаксис, а честно ищет переменную Молодец. Правильная запись — print("Молодец"). То же бывает при сравнении с ответом пользователя: if otvet == da: вместо if otvet == "da":. Функция input() всегда возвращает строку, поэтому и сравнивать её нужно со строкой в кавычках. Про то, как устроен ввод, рассказывает статья о функции input.

Миф: «Русские буквы в именах запрещены, поэтому и ошибка». Такого запрета не существует: Python 3 разрешает имена из букв любого алфавита. Ошибка возникает только потому, что переменную с таким именем никто не создал.

Переменная внутри функции

Переменная, созданная внутри функции, — это локальная переменная: она существует, только пока функция работает, и снаружи её не видно.

def poschitat():
    rezultat = 7 * 8
poschitat()
print(rezultat)

Функция выполнилась, rezultat внутри неё был равен 56, но после выхода имя исчезло. Правильный способ передать значение наружу — return:

def poschitat():
    rezultat = 7 * 8
    return rezultat

otvet = poschitat()
print(otvet)

Есть и обратный случай — UnboundLocalError. Это родственник того же исключения: внутри функции вы пытаетесь изменить внешнюю переменную, например schet = schet + 1, а Python считает её локальной и не видит у неё значения. Новичку проще всего передавать значение в функцию параметром и возвращать результат через return. В документации Python порядок поиска описан так: сначала локальные имена функции, затем внешние, затем встроенные вроде print. Как работают параметры и область видимости, разобрано в уроке про функции в Python.

Как найти причину NameError в Python за 4 шага

Чтобы найти причину NameError в Python, проверьте 4 вещи по порядку: какое имя указано в сообщении, где оно создаётся, совпадает ли написание и видно ли его из этого места программы.

  1. Имя из сообщения. Выпишите слово в кавычках после name.
  2. Место создания. Найдите в коде строку, где этому имени присваивается значение или где стоит def или import.
  3. Буква в букву. Сравните написание, включая регистр и раскладку.
  4. Порядок и видимость. Убедитесь, что создание стоит выше использования и не спрятано внутри функции или невыполненного условия.

Этот порядок пригодится и на экзамене: по материалам ФИПИ задание 16 ОГЭ по информатике выполняется на компьютере, и NameError в Python там проявится при первом же запуске проверки.

Миф: «Совет Did you mean всегда прав». Это не подтверждается: Python предлагает самое похожее известное ему имя, а оно может быть совсем не тем, что вы задумали. Например, вместо пропавшей переменной last он может предложить встроенное list.

Когда переименование не поможет

Переименование не поможет, если имя написано правильно, но не существует в нужный момент. Вот 4 таких случая.

  • Переменная создаётся в ветке, которая сработала 0 раз. Задайте значение по умолчанию до if.
  • Цикл выполнился 0 раз. Переменные из его тела не появятся; создайте их до цикла.
  • Имя создано в 1 функции, а используется в другой. Передайте его параметром или верните через return.
  • Ошибка в строке 1 с math или random. Не хватает строки import в начале файла.

Чего делать нельзя

Нельзя «лечить» такое сообщение, создавая переменную с пустым значением где попало: ошибка исчезнет, но программа начнёт выдавать неверный ответ. Вот правила.

  • Нельзя называть переменные почти одинаково — summa и suma в одной программе гарантируют путаницу.
  • Не стоит писать имена с большой буквы, если на это нет причины: встроенные функции пишутся маленькими.
  • Не следует набирать имена в разных раскладках — «х» и «x» выглядят одинаково, но это разные символы.
  • Нельзя использовать переменную из функции снаружи без return.
  • Не стоит слепо принимать совет Did you mean — сначала проверьте, то ли это имя.
  • Не допускается забывать кавычки вокруг текста, иначе слово станет именем.

Если программа не запускается вовсе и ни одна строка не выполняется, это не наш случай, а синтаксис: смотрите статью про SyntaxError и скобки.

Источники

[1] The Python Tutorial (официальная документация Python 3). Python Software Foundation. — синтаксис и встроенные функции.

[2] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.

[3] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования». — информатика 7–9.

Вопросы и ответы

Почему NameError в Python появляется не сразу?

Имена проверяются во время выполнения. Пока Python не дошёл до строки с неизвестным словом, он о нём не знает, поэтому всё выше успевает отработать.

Можно ли называть переменные по-русски?

Технически можно, но не стоит: в школьных программах и примерах принято писать имена латиницей, а смешивание раскладок порождает ошибки. По федеральной программе основного общего образования переменные изучают в 8 классе[3], и с первых задач удобнее приучаться к латинским именам.

Чем это отличается от SyntaxError?

Синтаксис проверяется до запуска, и при ошибке не выполнится ничего. Отсутствие переменной обнаруживается в момент выполнения конкретной строки.

Что такое UnboundLocalError?

Это частный случай того же исключения: внутри функции переменная считается локальной, но к моменту чтения у неё ещё нет значения. Чаще всего так бывает при попытке изменить внешнюю переменную.

Почему True работает, а true — нет?

Логические значения в Python пишутся с большой буквы: True и False. Слово true — просто незнакомое слово.

Как избежать опечаток в длинных именах?

Не набирайте имя каждый раз заново: копируйте его из строки, где оно создано, или пользуйтесь автодополнением в IDLE. И выбирайте понятные, но не слишком длинные слова.