{}const=>[]async()letfn</>var
PythonОсновыПрактика

NameError: name is not defined в Python: 7 причин и быстрый поиск ошибки

Разбираем NameError по сообщению и коду: опечатки, кавычки, порядок выполнения, ветки, функции, import и пошаговый чек-лист.

К

Кодик

Автор

5 мин чтения

NameError: name is not defined означает ровно одно: в момент выполнения Python не нашёл указанное имя в доступных областях видимости. Это не ошибка установки и не поломка интерпретатора. Обычно причина находится в одной строке: опечатке, неверном порядке команд, кавычках, импорте или области видимости.

Начните с последней строки Traceback: там написаны тип ошибки и неизвестное имя. Затем поднимитесь на одну строку выше, найдите файл и номер строки. Не окружайте весь код try/except: перехват скрывает симптом, но не создаёт отсутствующую переменную.

1Прочитать имя

В сообщении после name указано, что именно Python не смог найти.

2Открыть строку

Traceback показывает файл и номер места, где имя понадобилось.

3Найти определение

Проверьте написание, порядок выполнения, импорт и область видимости.

Что означает NameError и как читать сообщение

price = 120
print(prcie)

# Traceback (most recent call last):
#   File "shop.py", line 2, in <module>
#     print(prcie)
#           ^^^^^
# NameError: name 'prcie' is not defined. Did you mean: 'price'?
Часть сообщенияЧто сообщаетЧто делать
shop.pyФайл, который выполнялсяОткрыть именно эту версию файла
line 2Строка обращения к имениПроверить выделенное выражение
prcieИмя, которого нетСравнить с местом определения
Did you meanПодсказка по похожему имениПроверить, подходит ли предложение

Анатомия сообщения NameError в Python
Последняя строка называет проблему, а строки выше показывают путь к месту, где она проявилась.

NameError появляется во время выполнения. Файл может успешно запуститься и пройти несколько веток, прежде чем попадёт на неизвестное имя. Поэтому фраза «до этой строки всё работало» полностью совместима с NameError.
🔥 100 000+ учеников уже с нами

Устал читать теорию?
Пора кодить!

Кодик — приложение, где ты учишься программировать через практику. AI-наставник, интерактивные уроки, реальные проекты.

🤖 AI 24/7
🎓 Сертификаты
💰 Бесплатно
🚀 Начать учиться
Присоединились сегодня

Причины 1-3: опечатка, кавычки и порядок выполнения

1. Опечатка или другой регистр

user_name, username и User_Name являются тремя разными именами. Скопируйте имя из определения, а затем переименуйте его средствами редактора.

2. Текст записан без кавычек

Вызов print(Москва) ищет переменную Москва. Для строкового значения нужны кавычки: print('Москва').

3. Использование до присваивания

Интерпретатор идёт сверху вниз. Если print(total) расположен раньше total = 500, имени ещё не существует.

# 1. Регистр важен
user_name = 'Аня'
print(user_name)

# 2. Строка находится в кавычках
city = 'Москва'
print(city)

# 3. Сначала создаём имя, затем читаем
price = 500
discount = 50
total = price - discount
print(total)
Быстрая проверка без угадывания
  1. Скопируйте неизвестное имя из последней строки Traceback.
  2. Найдите все его вхождения в проекте через поиск редактора.
  3. Убедитесь, что хотя бы одно присваивание или объявление выполняется раньше проблемной строки.
  4. Если поиск пуст, проверьте похожие имена и регистр букв.

Причины 4-5: ветка условия и область видимости функции

Имя может быть написано правильно и даже встречаться выше, но это ещё не гарантирует, что присваивание было выполнено. В условии переменная создаётся только в выбранной ветке. В функции локальное имя доступно лишь во время её вызова.

age = 12

# Плохо: при age < 18 переменная ticket не создаётся
if age >= 18:
    ticket = 'взрослый'
print(ticket)

# Хорошо: значение определено во всех ветках
if age >= 18:
    ticket = 'взрослый'
else:
    ticket = 'детский'
print(ticket)
def calculate_total(price, count):
    result = price * count
    return result

# result является локальным именем и снаружи недоступен
total = calculate_total(250, 3)
print(total)

Области видимости имени в модуле и функции Python
Функция видит свои локальные имена и имена модуля, но модуль не получает прямой доступ к локальным переменным функции.

Возвращайте нужный результат

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

Причины 6-7: импорт и неверное имя функции

После import math модуль доступен под именем math, а его функции вызываются через точку. После from math import sqrt доступно имя sqrt, но имя math само по себе не появляется. Это два корректных, но разных способа импорта.

ИмпортПравильный вызовОшибочный вызов
import mathmath.sqrt(25)sqrt(25)
from math import sqrtsqrt(25)math.sqrt(25)
import numpy as npnp.array([1, 2])numpy.array(...)
6. Импорт не совпадает с вызовом

Посмотрите на строку import и используйте ровно то имя, которое она создаёт: модуль, импортированную функцию или алиас.

7. Функция объявлена после вызова

Определение через def тоже выполняется сверху вниз. Вызов в основном коде должен находиться ниже определения или внутри функции, которую запустят позже.

Файл назван как библиотека

Файл random.py или math.py может перекрыть стандартный модуль. Это чаще вызывает AttributeError или ImportError, но при странном поведении переименуйте файл и удалите его кэш.

Если сообщение выглядит как ModuleNotFoundError, проблема уже другая: Python не нашёл модуль, а не обычное имя. Для неё есть отдельная инструкция No module named: как исправить.

Алгоритм поиска NameError за семь шагов

Не меняйте сразу несколько мест. Пройдите проверки сверху вниз и запускайте файл после каждого исправления. Тогда будет понятно, какое изменение действительно устранило ошибку, а какая правка была лишней.

Чек-лист диагностики
  1. Прочитайте последнюю строку Traceback и выпишите неизвестное имя.
  2. Откройте указанный файл на указанном номере строки.
  3. Сравните написание и регистр с определением через поиск по проекту.
  4. Проверьте, не должна ли последовательность символов быть строкой в кавычках.
  5. Убедитесь, что присваивание выполняется раньше обращения и во всех нужных ветках.
  6. Проверьте границу функции: локальное значение нужно вернуть через return.
  7. Сопоставьте форму import с формой вызова.

Маршрут поиска причины NameError в Python
Большинство NameError находится до пятого шага: по точному имени, поиску определения и проверке порядка выполнения.

Проверяйте тем же сценарием. После исправления повторите ввод или действие, которое вызывало ошибку. Обычный запуск может пройти по другой ветке и создать ложное ощущение, что проблема исчезла.
Короткие ответы
Чем NameError отличается от SyntaxError?

SyntaxError не даёт разобрать код. NameError возникает во время выполнения синтаксически корректной команды, когда нужное имя не найдено.

Нужно ли устанавливать библиотеку при NameError?

Обычно нет. Установка относится к отсутствующим модулям. При NameError сначала проверяют обычные имена, импорт и область видимости.

Поможет ли try except NameError?

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

Почему переменная существует в функции, но не снаружи?

Она локальная и живёт в области видимости вызова функции. Нужное значение следует вернуть через return.

Почему ошибка возникает только иногда?

Вероятно, имя создаётся лишь в одной ветке if или внутри цикла, который иногда не выполняется. Определите безопасное начальное значение или закройте все ветки.

Как перестать бояться сообщений об ошибках

Потренируйте переменные, функции и области видимости в курсе Python. Для общего подхода пригодится статья Почему код не работает: 15 ошибок новичков.

Сохраняйте минимальный пример ошибки: пять строк, которые всё ещё воспроизводят NameError. Пока вы сокращаете пример, лишние детали исчезают, а причина почти всегда становится видимой.

🎯Хватит откладывать

Понравилась статья?
Пора применять на практике!

В Кодик ты не просто читаешь — ты сразу пишешь код. Теория + практика = реальный скилл.

Мгновенная практика
🧠AI объяснит код
🏆Сертификат

Без регистрации • Без карты