Когда я запускаю рекурсивную функцию и она превышает предел глубины рекурсии, отображается следующая ошибка:
Python 3.12.4+ (heads/3.12:99bc8589f0, Jul 27 2024, 11:20:07) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
Насколько я понимаю, поскольку трассировка все та же File "<stdin>", line 1, in f
, она не показывает всего (потому что, очевидно, это не очень полезно), а только сообщает мне, что эта строка была повторена еще 996 раз.
Когда я вручную изменяю предел рекурсии, я ожидаю, что размер трассировки также увеличится. Но это не так:
>>> sys.setrecursionlimit(2000)
>>>
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 997 more times]
RecursionError: maximum recursion depth exceeded
Я удвоил лимит рекурсии, поэтому теперь ожидаю, что размер трассировки удвоится, но там написано, что предыдущая строка повторяется 997 раз. Почему это так?
Я также нашел этот вопрос, который кажется таким же, как мой вопрос, но это не так. Мой вопрос конкретно касается размера обратной трассировки.
Почему увеличение глубины рекурсии приводит к ошибке переполнения стека?
См. docs.python.org/3/library/traceback.html#stacksummary-objects. Метод extract
, создающий экземпляры, имеет аргумент limit
, который по умолчанию равен None
; Я предполагаю, что вы можете указать целочисленное значение, чтобы охватить большую или меньшую часть фактического стека, но я не знаю, как создать пример.
@chepner Спасибо за подсказку. Из упомянутых вами документов я обнаружил, что существует переменная sys.tracebacklimit, которая ограничивает размер обратной трассировки. docs.python.org/3/library/sys.html#sys.tracebacklimit
Я понял, что это относится к переменной sys.tracebacklimit. Это ограничивает размер трассировки.
>>> def f(): f()
...
>>>
>>> import sys
>>> sys.setrecursionlimit(2000)
>>>
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 997 more times]
RecursionError: maximum recursion depth exceeded
>>>
>>> sys.tracebacklimit = 1500
>>>
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 1497 more times]
RecursionError: maximum recursion depth exceeded
Вы смотрите на строковое представление объекта
StackSummary
, который, как я подозреваю, имеет свой собственный предел в 1000 кадров, полученный из ограничения размера стека по умолчанию, но фиксированный и независимый от него.