Python 我在哪里可以看到”的数量;“额外递归”;为从递归限制恢复而保留的堆栈?

Python 我在哪里可以看到”的数量;“额外递归”;为从递归限制恢复而保留的堆栈?,python,recursion,internals,Python,Recursion,Internals,这个问题是关于如何理解python内部的 以代码为例: import sys sys.setrecursionlimit(100) def myfunc(n): print(n, sys.getrecursionlimit()) try: myfunc(n+1) except Exception as e1: print('Cannot proceed') print(e1) try:

这个问题是关于如何理解python内部的

以代码为例:

import sys

sys.setrecursionlimit(100)

def myfunc(n):
    print(n, sys.getrecursionlimit())
    try:
        myfunc(n+1)
    except Exception as e1:
        print('Cannot proceed')
        print(e1)
        try:
            myfunc(n+1)
        except Exception as e2:
            print('That went wrong')
            print(e2)

myfunc(0)
警告-此代码用于python内部研究,并导致python崩溃。导致实际的
致命Python错误:无法从堆栈溢出中恢复。

结果是:

....
....
92 100
93 100
94 100
95 100
Cannot proceed
maximum recursion depth exceeded while calling a Python object
95 100
96 100
97 100
98 100
99 100
100 100
101 100
102 100
103 100
104 100
105 100
106 100
107 100
108 100
109 100
110 100
111 100
112 100
113 100
114 100
115 100
116 100
117 100
118 100
119 100
120 100
121 100
122 100
123 100
124 100
125 100
126 100
127 100
128 100
129 100
130 100
131 100
132 100
133 100
134 100
135 100
136 100
137 100
138 100
139 100
140 100
141 100
142 100
143 100
144 100
Fatal Python error: Cannot recover from stack overflow.

Current thread 0x0000379c (most recent call first):
  File "....test.py", line 7 in myfunc
  File "....test.py", line 9 in myfunc
....
....
这就是我大致想象的情况:

  • 在达到递归极限之前,该函数一直计数到接近100。接近100,而不是100,因为python本身使用某些堆栈
  • 当异常发生时,实际递归限制设置得更高以允许恢复
  • 由于我的函数坚持要继续执行递归,它将在一段时间后达到新的限制
  • 但这一次,这种“扩展限制”恢复机制已耗尽,出现了致命的堆栈溢出
  • 我说得对吗


    我的问题:我是否可以使用与
    sys.getrecursionlimit()
    )等价的东西来查看某个系统变量中的“额外递归”堆栈的数量?

    我认为,在这种情况下,之所以可以超过100,是因为第二次递归使用了不同的起始点。据我所知,堆栈溢出错误只是内存不足的一种情况——在运行更多、更少或更高质量的计算机上尝试它,我希望它会有所不同。我认为,在这种情况下,之所以可以超过100,是因为第二次递归使用了不同的起始点。据我所知,堆栈溢出错误只是内存不足的一种情况——在运行更多或更少的东西时,或者在质量更高的计算机上尝试它,我希望它会有所不同。