{}const=>[]async()letfn</>var
PythonОсновы

IndentationError: unexpected indent, что это и как починить

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

К

Кодик

Автор

6 мин чтения

IndentationError: unexpected indent значит, что в начале строки стоят лишние пробелы: Python ждал код на прежнем уровне, а получил сдвиг вправо. Чинится за минуту: либо убрать отступ у строки, номер которой назван в сообщении, либо дописать строкой выше заголовок блока, который вы стёрли.

Обычно до ошибки было одно из трёх. Вы удалили строку с for или if, а тело осталось сдвинутым. Вы вставили кусок из чата со своими пробелами. Вы печатали с телефона, где автоотступ дописывает четыре пробела сам. Всё, что ниже, запущено на Python 3.13.0.

  1. Отступ это синтаксис

Пробелами Python задаёт границы блока, ровно как фигурные скобки в Java или C.

  1. Причин ровно две

Либо отступ стоит там, где блока нет. Либо строки одного блока сдвинуты на разную ширину.

  1. Телефон подкидывает свои

Копирование из мессенджера, 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.

🔥 100 000+ учеников уже с нами

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

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

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

Три поломки, три настоящих вывода

Причины разные, а сообщение одно, поэтому узнавать их надо по форме кода.

Поломка 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 пробела. Если тела пока нет, написать pass

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 за минуту

  1. Откройте строку из сообщения и посмотрите на строку прямо над ней: заканчивается ли она двоеточием.

  2. Двоеточия нет, а отступ есть: уберите отступ или допишите пропавший for, if, def, while.

  3. Двоеточие есть: сравните отступ с соседними строками того же блока, все они обязаны стоять на одной ширине.

  4. Нажмите Home и стрелкой вправо посчитайте пробелы. Кратно четырём, значит порядок.

  5. Глазами не видно: прогоните файл через repr из раздела выше и ищите \xa0 или \t.

Ошибка ушла, если

  • python3 файл.py отработал молча или напечатал ваш вывод.

  • В выводе repr слева только пробелы, и их количество кратно четырём.

  • Появилась другая ошибка, например NameError: файл дошёл до выполнения, это уже победа.

Править только ту строку, что в сообщении

Номер в сообщении это место обнаружения. Если отступ там выглядит правильным, ошибка выше: пропало двоеточие или стёрся for.

Выравнивать на глаз

Три пробела и четыре на телефонном экране неотличимы. Выделите блок, снимите отступ целиком и наберите заново по 4 пробела.

Винить комментарий с отступом

Проверено запуском: файл из x = 1, сдвинутой строки # комментарий и print(x) печатает 1.

Быстрая привычка: держите отступ ровно 4 пробела и включите в редакторе замену табов на пробелы. Тогда из всего семейства ошибок вам останется только забытое двоеточие.

✨ А если ты не хочешь учиться в одиночку — у нас есть Кодик!

Кодик — это не просто приложение, а твой личный наставник в мире программирования. Он объясняет всё простыми словами, помогает закреплять знания на практике и даёт крутые ачивки за успехи 🏅

А ещё у нас тёплое и дружеское комьюнити в telegram, где каждый может задать вопрос и получить ответ — без осуждения и лишней теории. Мы вместе решаем задачи, разбираем ошибки и поддерживаем друг друга на пути к цели.

С Кодиком учиться программированию действительно приятно и интересно 💙

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

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

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

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

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