#Что означает ошибка
maximum recursion depth exceeded
Рекурсия слишком глубока или бесконечна. Добавьте базовый случай, замените цикл или используйте стек.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет базы | Одна функция повторяется без приближения к завершению | Добавить достижимый базовый случай |
| Глубокая рекурсия | Вызовы конечны, но глубина превышает лимит Python | Переписать обход с явным стеком |
| Взаимные вызовы | A вызывает B, B снова A без условий выхода | Разорвать взаимную рекурсию |
| __getattr__ | В трассировке повторяется доступ к атрибуту объекта | Проверить __getattr__ и делегирование |
#Пошаговое решение
- Найдите повторяющийся вызов в трассировкеВ терминале проекта запустите программу и прокрутите traceback от конца вверх. Запишите функцию и строку, повторяющиеся перед
RecursionError. Откройте файл в редакторе и поставьте точку останова либо временно выведите аргументы черезprintв начале этой функции. Если аргументы не меняются или число оставшихся элементов не уменьшается, это признак отсутствующего условия завершения. - Добавьте базовый случай, который достигаетсяПроверьте функцию рекурсии: до следующего вызова должен проверяться простой случай, например
if n <= 1: return 1для рекурсивного вычисления факториала положительного числа. На каждом проходе аргумент должен приближаться к базовому случаю, напримерn - 1. Для обхода графа или дерева добавьте учёт уже посещённых узлов, чтобы связи с циклами не запускали бесконечные переходы. Сохраните исходную версию кода и добавьте проверку отрицательных или неожиданно больших входных данных. - Для глубокой корректной рекурсии выберите итерациюЕсли алгоритм конечный, но входные данные содержат тысячи уровней, перепишите обход на цикл с явным списком-стеком
stack = [root]и обработкой черезwhile stack:. Увеличивать лимит командойsys.setrecursionlimit(...)ради обхода ошибки опасно: большой лимит может привести к аварийному завершению интерпретатора из-за переполнения стека C. Используйте такой метод лишь при понимании глубины и доступного стека, а не как основное исправление. - Проверьте крайние случаи и отсутствие новых цикловЗапустите модульные тесты либо повторите входные данные, ранее вызывавшие ошибку. Затем проверьте пустой ввод, одно значение и случай с зацикленными ссылками. Успех — нет
RecursionError, результат совпадает с ожидаемым и использование памяти не растёт без конца. Если проблема возникает только в стороннем пакете, сохраните версии Python и пакета и минимальный пример, не редактируйте установленную библиотеку напрямую.
#Если проблема осталась
Если «Python: RecursionError: maximum recursion depth exceeded» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.