IndentationError: unexpected indent значит, что в начале строки стоят лишние пробелы: Python ждал код на прежнем уровне, а получил сдвиг вправо. Чинится за минуту: либо убрать отступ у строки, номер которой назван в сообщении, либо дописать строкой выше заголовок блока, который вы стёрли.
Обычно до ошибки было одно из трёх. Вы удалили строку с for или if, а тело осталось сдвинутым. Вы вставили кусок из чата со своими пробелами. Вы печатали с телефона, где автоотступ дописывает четыре пробела сам. Всё, что ниже, запущено на Python 3.13.0.
Отступ это синтаксис
Пробелами Python задаёт границы блока, ровно как фигурные скобки в Java или C.
Причин ровно две
Либо отступ стоит там, где блока нет. Либо строки одного блока сдвинуты на разную ширину.
Телефон подкидывает свои
Копирование из мессенджера, PDF и с сайта приносит неразрывные пробелы и табы.

Как прочитать сообщение и не искать не там?
Python печатает три строки, и каждая отвечает на свой вопрос: где файл, где строка, что именно не так. Вот настоящий вывод запуска python3 chek.py.
File "chek.py", line 3
total = total + p
IndentationError: unexpected indentЧасть сообщения | Что означает | Что с ней делать |
|---|---|---|
File "chek.py" | путь к файлу, который запустился | сверьте с тем, что открыт в редакторе |
line 3 | строка, на которой парсер споткнулся | открывайте её и обязательно смотрите строку выше |
total = total + p | сама строка с лишним отступом | посчитайте пробелы слева: их должно быть 0, 4 или 8 |
unexpected indent | отступ лишний | убрать пробелы, а не добавить. Слово expected значило бы обратное |
стрелка ^ | у этой ошибки её нет | она появляется у соседних ошибок семейства, разбор ниже |
Честная оговорка про line 3. Это место, где Python заметил сдвиг, а не всегда место ошибки: строке total = total + p не хватает начальника, выше должен стоять for p in prices:. Править придётся строку 2.
Три поломки, три настоящих вывода
Причины разные, а сообщение одно, поэтому узнавать их надо по форме кода.
Поломка 1: тело осталось, заголовок блока стёрли
# было: chek.py
total = 0
prices = [199, 349, 90]
total = total + p
print("итог:", total)
# python3 chek.py
File "chek.py", line 3
total = total + p
IndentationError: unexpected indentКлассика правки задним числом: цикл переписали, строку for удалили, тело забыли. Python увидел сдвиг без открытого блока.
# стало: chek_ok.py
total = 0
prices = [199, 349, 90]
for p in prices:
total = total + p
print("итог:", total)
# python3 chek_ok.py
итог: 638Поломка 2: вставленный кусок глубже, чем блок
# было: price.py
def total_price(items):
total = 0
for price in items:
total += price
return total
# python3 price.py
File "price.py", line 3
for price in items:
IndentationError: unexpected indentБлок открыт, отступ уместен, но total = 0 задала уровень тела в 4 пробела, а вставка приехала на 8. Python равняет весь блок по первой строке.
# стало: price_ok.py
def total_price(items):
total = 0
for price in items:
total += price
return total
print(total_price([199, 349, 90]))
# python3 price_ok.py
638Поломка 3: строка после переноса по скобкам
# было: spisok.py
print("чек:",
"хлеб",
"молоко")
print("итого: 289")
# python3 spisok.py
File "spisok.py", line 4
print("итого: 289")
IndentationError: unexpected indentВнутри круглых скобок отступы не значат ничего. Но на третьей строке скобка закрылась, правило включилось обратно, и четвёртая строка обязана начинаться с нуля.
# стало: spisok_ok.py
print("чек:",
"хлеб",
"молоко")
print("итого: 289")
# python3 spisok_ok.py
чек: хлеб молоко
итого: 289Соседи по семейству: ещё три сообщения
Та же кривая расстановка пробелов даёт ещё три сообщения, и лечатся они по-разному.
File "blok.py", line 3
print("доступ открыт")
^^^^^
IndentationError: expected an indented block after 'if' statement on line 2
File "konec.py", line 4
print("конец")
^
IndentationError: unindent does not match any outer indentation level
File "tabs.py", line 3
print("плюс")
^
TabError: inconsistent use of tabs and spaces in indentationСообщение | Когда возникает | Что сделать |
|---|---|---|
expected an indented block after ... | поставили двоеточие, а тело блока не сдвинули или оставили пустым | сдвинуть следующую строку на 4 пробела. Если тела пока нет, написать |
unindent does not match any outer indentation level | вышли из блока не на тот уровень: было 8 и 4, вернулись на 6 | выровнять строку ровно по одному из уже существующих уровней |
TabError: inconsistent use of tabs and spaces | в одном блоке часть строк с табами, часть с пробелами | включить в редакторе замену табов на пробелы и отбить отступы заново |
В первом сообщении указан и вид блока, и номер строки заголовка: такой подсказки не было до Python 3.10, где сообщения об ошибках переписали.
Невидимые символы после копирования
Код из чата, PDF или из блока на сайте часто приносит неразрывный пробел U+00A0 вместо обычного. Ширина та же, глазами не отличить, поэтому смотрите на начало строк в виде кодов символов.
python3 -c "
for n, line in enumerate(open('copypaste.py', encoding='utf-8'), 1):
print(n, repr(line[:12]))
"
# вывод:
1 'for i in ran'
2 '\xa0\xa0\xa0\xa0print(i)'В строке 2 вместо четырёх пробелов четыре \xa0, табуляция показалась бы как \t. Запуск такого файла даёт вовсе не IndentationError.
Реальный вывод python3 copypaste.py
SyntaxError: invalid non-printable character U+00A0
Лечение: выделить отступ, стереть, набрать пробелы руками.
Для табов есть готовая проверка:
python3 -m tabnanny tabs.pyпечатаетtabs.py 3 '\t print("плюс")'. Чистые пробелы она не ловит.
Алгоритм починки и три промаха
Порядок важен: первые два шага закрывают большинство случаев.
Чиним IndentationError за минуту
Откройте строку из сообщения и посмотрите на строку прямо над ней: заканчивается ли она двоеточием.
Двоеточия нет, а отступ есть: уберите отступ или допишите пропавший
for,if,def,while.Двоеточие есть: сравните отступ с соседними строками того же блока, все они обязаны стоять на одной ширине.
Нажмите Home и стрелкой вправо посчитайте пробелы. Кратно четырём, значит порядок.
Глазами не видно: прогоните файл через
reprиз раздела выше и ищите\xa0или\t.
Ошибка ушла, если
python3 файл.pyотработал молча или напечатал ваш вывод.В выводе repr слева только пробелы, и их количество кратно четырём.
Появилась другая ошибка, например NameError: файл дошёл до выполнения, это уже победа.
Править только ту строку, что в сообщении
Номер в сообщении это место обнаружения. Если отступ там выглядит правильным, ошибка выше: пропало двоеточие или стёрся for.
Выравнивать на глаз
Три пробела и четыре на телефонном экране неотличимы. Выделите блок, снимите отступ целиком и наберите заново по 4 пробела.
Винить комментарий с отступом
Проверено запуском: файл из x = 1, сдвинутой строки # комментарий и print(x) печатает 1.
Быстрая привычка: держите отступ ровно 4 пробела и включите в редакторе замену табов на пробелы. Тогда из всего семейства ошибок вам останется только забытое двоеточие.
✨ А если ты не хочешь учиться в одиночку — у нас есть Кодик!
Кодик — это не просто приложение, а твой личный наставник в мире программирования. Он объясняет всё простыми словами, помогает закреплять знания на практике и даёт крутые ачивки за успехи 🏅
А ещё у нас тёплое и дружеское комьюнити в telegram, где каждый может задать вопрос и получить ответ — без осуждения и лишней теории. Мы вместе решаем задачи, разбираем ошибки и поддерживаем друг друга на пути к цели.
С Кодиком учиться программированию действительно приятно и интересно 💙
