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, ты закрываешь сразу все случаи.
- Тело условия — после
if,elif,elseПодробный разбор — в гайде if, elif и else в Python: условия с примерами.
- Тело цикла — после
forиwhileКак устроены циклы и их блоки — в гайде Циклы в Python: for, while, break и continue.
- Тело функции — после
defОтступ показывает, какие строки входят в функцию: см. Функции в Python: от def до lambda.
Когда отступ — дело вкуса, а когда нет?
Технически Python принимает любой одинаковый отступ: хоть два пробела, хоть таб, хоть восемь пробелов — лишь бы внутри блока он был одинаковым. Но это не повод экспериментировать. Стандарт сообщества — четыре пробела, и его понимают все редакторы, линтеры и коллеги. Смешивать разные отступы нельзя никогда: даже если глазами выглядит ровно, Python считает символы, а не пиксели.
Короткие ответы на вопросы про IndentationError
Что значит «expected an indented block»?
Это сообщение значит, что после строки с двоеточием (например, if, for или def) Python ожидал вложенный блок с отступом, но не нашёл его. Нужно добавить отступ в четыре пробела перед строками, которые должны входить в этот блок.
Таб или пробелы — что использовать?
Пробелы. Стандарт PEP 8 рекомендует четыре пробела на уровень. Главное — не смешивать табы и пробелы в одном файле: именно смешивание вызывает TabError. Большинство редакторов умеют автоматически подставлять пробелы вместо таба.
Чем IndentationError отличается от SyntaxError?
IndentationError — это частный вид SyntaxError, связанный именно с отступами. Обе ошибки возникают на этапе разбора кода, до запуска. Просто IndentationError точнее подсказывает, что проблема в отступе, а не в другой части синтаксиса.
Кот-наставник— Запомни: двоеточие в конце строки — это обещание отступа. Поставил
:— на следующей строке обязателен отступ в четыре пробела.— И не смешивай табы с пробелами. Выглядит одинаково, а Python видит разные символы — и падает!
Отступы чувствуются пальцами, а не глазами!
На SkillPy ты пишешь код сам, а AI-наставник сразу показывает, где съехал отступ и почему Python ругается. Он не сверяет с шаблоном, а понимает твоё решение и объясняет ошибку человеческим языком.
