SkillPy

IndentationError в Python: unexpected indent и решение

Время чтения8 мин чтения
Опубликовано29 августа 2026 г.
Легко
Python
Синтаксис
Ошибки
Начинающим
IndentationError в Python: unexpected indent и решение

IndentationError в Python — это ошибка отступа: интерпретатор не смог разобрать, какие строки входят в блок кода, а какие нет. В большинстве языков блоки задаются фигурными скобками {}, а в Python — отступами, поэтому лишний пробел или его отсутствие ломает программу ещё до запуска. Ниже — что означают сообщения unexpected indent и expected an indented block и как всё быстро починить.

Коротко: как исправить?

IndentationError: unexpected indent — строка имеет лишний отступ, которого не должно быть: убери пробелы в начале строки. IndentationError: expected an indented block — наоборот, после двоеточия (if, for, def и т.п.) нужен отступ, а его нет: добавь четыре пробела. Правило одно: все строки одного блока стоят с одинаковым отступом в 4 пробела, и таб с пробелами не смешивают.

Почему Python требует отступы?

В Python отступ — это не оформление «для красоты», а часть синтаксиса. Именно по отступу интерпретатор понимает, где начинается и заканчивается блок: тело функции, ветка if, тело цикла. Двоеточие в конце строки говорит «сейчас будет вложенный блок», а отступ показывает, какие строки в него входят.

IndentationError — это разновидность синтаксической ошибки (SyntaxError), которая возникает, когда Python не может разобрать отступы в коде. Ошибка появляется до запуска программы, на этапе разбора текста.

Три случая, когда возникает ошибка

1. unexpected indent — лишний отступ

print("Начало")
    print("Лишний отступ")
SyntaxError: unexpected indent

Вторая строка сдвинута вправо, хотя перед ней нет двоеточия и никакого блока не открывалось. Python видит отступ «из ниоткуда» и не понимает, к чему он относится. Решение — убрать лишние пробелы в начале строки, чтобы обе команды стояли на одном уровне.

2. expected an indented block — отступа не хватает

if True:
print("Привет")
SyntaxError: expected an indented block after 'if' statement on line 1

Здесь обратная ситуация: двоеточие после if пообещало вложенный блок, но следующая строка идёт без отступа. Python ждал тело условия и не нашёл его. Решение — добавить отступ в четыре пробела перед print. То же сообщение появляется после for, while, def и else, если забыть отступить их тело.

3. TabError — смешаны табы и пробелы

if True:
	print("Отступ табом")
        print("Отступ пробелами")
SyntaxError: inconsistent use of tabs and spaces in indentation

Строки выглядят одинаково выровненными, но одна отступлена табом, а другая — пробелами. Для человека это неразличимо, а для Python — разные символы, отсюда и текст inconsistent use of tabs and spaces. TabError — частный случай ошибки отступа. Родственная ошибка — IndentationError: unindent does not match any outer indentation level: она возникает, когда отступ строки не совпадает ни с одним из открытых уровней выше. Решение общее — держать во всём файле один вид отступа; стандарт — четыре пробела.

Правильный вариант — единый отступ в четыре пробела:

if True:
    print("Привет")
    print("Всё на одном уровне")
Привет
Всё на одном уровне

Где та же логика ударит снова?

Отступ требуется после каждого двоеточия, открывающего блок, — это не только про if. Тело цикла for и while, тело функции после def, ветки elif и else, блоки try/except — всё это вложенные блоки, и каждый нужно отступить. Логика одна и та же, поэтому, разобравшись с if, ты закрываешь сразу все случаи.

Когда отступ — дело вкуса, а когда нет?

Технически Python принимает любой одинаковый отступ: хоть два пробела, хоть таб, хоть восемь пробелов — лишь бы внутри блока он был одинаковым. Но это не повод экспериментировать. Стандарт сообщества — четыре пробела, и его понимают все редакторы, линтеры и коллеги. Смешивать разные отступы нельзя никогда: даже если глазами выглядит ровно, Python считает символы, а не пиксели.

Короткие ответы на вопросы про IndentationError

Что значит «expected an indented block»?

Это сообщение значит, что после строки с двоеточием (например, if, for или def) Python ожидал вложенный блок с отступом, но не нашёл его. Нужно добавить отступ в четыре пробела перед строками, которые должны входить в этот блок.

Таб или пробелы — что использовать?

Пробелы. Стандарт PEP 8 рекомендует четыре пробела на уровень. Главное — не смешивать табы и пробелы в одном файле: именно смешивание вызывает TabError. Большинство редакторов умеют автоматически подставлять пробелы вместо таба.

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

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

Кот-наставник

— Запомни: двоеточие в конце строки — это обещание отступа. Поставил : — на следующей строке обязателен отступ в четыре пробела.

— И не смешивай табы с пробелами. Выглядит одинаково, а Python видит разные символы — и падает!

Отступы чувствуются пальцами, а не глазами!

На SkillPy ты пишешь код сам, а AI-наставник сразу показывает, где съехал отступ и почему Python ругается. Он не сверяет с шаблоном, а понимает твоё решение и объясняет ошибку человеческим языком.