NameError: name is not defined означает ровно одно: в момент выполнения Python не нашёл указанное имя в доступных областях видимости. Это не ошибка установки и не поломка интерпретатора. Обычно причина находится в одной строке: опечатке, неверном порядке команд, кавычках, импорте или области видимости.
Начните с последней строки Traceback: там написаны тип ошибки и неизвестное имя. Затем поднимитесь на одну строку выше, найдите файл и номер строки. Не окружайте весь код try/except: перехват скрывает симптом, но не создаёт отсутствующую переменную.
В сообщении после name указано, что именно Python не смог найти.
Traceback показывает файл и номер места, где имя понадобилось.
Проверьте написание, порядок выполнения, импорт и область видимости.
Что означает 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 | Подсказка по похожему имени | Проверить, подходит ли предложение |

Последняя строка называет проблему, а строки выше показывают путь к месту, где она проявилась.
Причины 1-3: опечатка, кавычки и порядок выполнения
user_name, username и User_Name являются тремя разными именами. Скопируйте имя из определения, а затем переименуйте его средствами редактора.
Вызов print(Москва) ищет переменную Москва. Для строкового значения нужны кавычки: print('Москва').
Интерпретатор идёт сверху вниз. Если print(total) расположен раньше total = 500, имени ещё не существует.
# 1. Регистр важен
user_name = 'Аня'
print(user_name)
# 2. Строка находится в кавычках
city = 'Москва'
print(city)
# 3. Сначала создаём имя, затем читаем
price = 500
discount = 50
total = price - discount
print(total)- Скопируйте неизвестное имя из последней строки Traceback.
- Найдите все его вхождения в проекте через поиск редактора.
- Убедитесь, что хотя бы одно присваивание или объявление выполняется раньше проблемной строки.
- Если поиск пуст, проверьте похожие имена и регистр букв.
Причины 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)
Функция видит свои локальные имена и имена модуля, но модуль не получает прямой доступ к локальным переменным функции.
Если значение вычислено внутри функции и понадобится снаружи, верните его через return и сохраните результат вызова. Делать каждую переменную глобальной не нужно: это усложнит связи и поиск ошибок.
Причины 6-7: импорт и неверное имя функции
После import math модуль доступен под именем math, а его функции вызываются через точку. После from math import sqrt доступно имя sqrt, но имя math само по себе не появляется. Это два корректных, но разных способа импорта.
| Импорт | Правильный вызов | Ошибочный вызов |
|---|---|---|
import math | math.sqrt(25) | sqrt(25) |
from math import sqrt | sqrt(25) | math.sqrt(25) |
import numpy as np | np.array([1, 2]) | numpy.array(...) |
Посмотрите на строку import и используйте ровно то имя, которое она создаёт: модуль, импортированную функцию или алиас.
Определение через def тоже выполняется сверху вниз. Вызов в основном коде должен находиться ниже определения или внутри функции, которую запустят позже.
Файл random.py или math.py может перекрыть стандартный модуль. Это чаще вызывает AttributeError или ImportError, но при странном поведении переименуйте файл и удалите его кэш.
Если сообщение выглядит как ModuleNotFoundError, проблема уже другая: Python не нашёл модуль, а не обычное имя. Для неё есть отдельная инструкция No module named: как исправить.
Алгоритм поиска NameError за семь шагов
Не меняйте сразу несколько мест. Пройдите проверки сверху вниз и запускайте файл после каждого исправления. Тогда будет понятно, какое изменение действительно устранило ошибку, а какая правка была лишней.
- Прочитайте последнюю строку Traceback и выпишите неизвестное имя.
- Откройте указанный файл на указанном номере строки.
- Сравните написание и регистр с определением через поиск по проекту.
- Проверьте, не должна ли последовательность символов быть строкой в кавычках.
- Убедитесь, что присваивание выполняется раньше обращения и во всех нужных ветках.
- Проверьте границу функции: локальное значение нужно вернуть через return.
- Сопоставьте форму import с формой вызова.

Большинство NameError находится до пятого шага: по точному имени, поиску определения и проверке порядка выполнения.
Чем NameError отличается от SyntaxError?
SyntaxError не даёт разобрать код. NameError возникает во время выполнения синтаксически корректной команды, когда нужное имя не найдено.
Нужно ли устанавливать библиотеку при NameError?
Обычно нет. Установка относится к отсутствующим модулям. При NameError сначала проверяют обычные имена, импорт и область видимости.
Поможет ли try except NameError?
Он может обработать ожидаемое отсутствие имени в редком динамическом сценарии, но в учебном коде чаще скрывает опечатку или ошибочный порядок команд.
Почему переменная существует в функции, но не снаружи?
Она локальная и живёт в области видимости вызова функции. Нужное значение следует вернуть через return.
Почему ошибка возникает только иногда?
Вероятно, имя создаётся лишь в одной ветке if или внутри цикла, который иногда не выполняется. Определите безопасное начальное значение или закройте все ветки.
Потренируйте переменные, функции и области видимости в курсе Python. Для общего подхода пригодится статья Почему код не работает: 15 ошибок новичков.
Сохраняйте минимальный пример ошибки: пять строк, которые всё ещё воспроизводят NameError. Пока вы сокращаете пример, лишние детали исчезают, а причина почти всегда становится видимой.
