最大递归并不完全是 sys.getrecursionlimit() 所声称的.怎么来的?

编程入门 行业动态 更新时间:2024-10-24 12:23:13
本文介绍了最大递归并不完全是 sys.getrecursionlimit() 所声称的.怎么来的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我做了一个小函数来实际测量最大递归限制:

I've made a small function that will actually measure the max recursion limit:

def f(x): r = x try: r = f(x+1) except Exception as e: print(e) finally: return r

要知道会发生什么,我已经检查过:

To know what to expect I've checked:

In [28]: import sys In [29]: sys.getrecursionlimit() Out[29]: 1000

不过

In [30]: f(0) maximum recursion depth exceeded Out[30]: 970

这个数字不是固定的,总是在 ~970 左右,并且在不同的 python 实例之间略有变化(例如,从 spyder 到系统 cmd 提示符).

The number is not fixed, always around ~970, and slightly changes between different instances of python (e.g. from within spyder to system cmd prompt).

请注意,我在 python3 上使用 ipython.

Please note that I'm using ipython on python3.

这是怎么回事?为什么我得到的实际限制低于 sys.getrecursionlimit() 值?

What's going on? Why is the actual limit I'm getting lower than the sys.getrecursionlimit() value?

推荐答案

递归限制不是递归的限制,而是python解释器堆栈的最大深度.在你的函数执行之前,堆栈上有一些东西.Spyder 会在调用您的脚本之前执行一些 Python 内容,就像 ipython 等其他解释器一样.

The recursion limit is not the limit on recursion but the maximum depth of the python interpreter stack.There is something on the stack before your function gets executed. Spyder executes some python stuff before it calls your script, as do other interpreters like ipython.

您可以通过 inspect 模块中的方法检查堆栈.

You can inspect the stack via methods in the inspect module.

在我的 CPython 中:

In CPython for me:

>>>print(len(inspect.stack())) 1

在我的 Ipython 中:

In Ipython for me:

>>>print(len(inspect.stack())) 10

正如 knbk 在评论中指出的,一旦您达到堆栈限制,就会抛出 RecursionError 并且解释器会稍微提高堆栈限制,以便您可以优雅地处理错误.如果你也用尽了那个限制,python 就会崩溃.

As knbk pointed out in the comments as soon as you hit the stack limit a RecursionError is thrown and the interpreter raises the stack limit a bit to give you a possibility to handle the error gracefully. If you also exhaust that limit python will crash.

更多推荐

最大递归并不完全是 sys.getrecursionlimit() 所声称的.怎么来的?

本文发布于:2023-11-27 08:54:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637377.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:递归   sys   getrecursionlimit

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!