您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么Python对可嵌套的静态块数有限制?

为什么Python对可嵌套的静态块数有限制?

此限制不仅适用于for循环,还适用于所有其他控制流程块。嵌套控制流块的数量限制在code.h内部定义,常量为CO_MAXBLOCKS

#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */

此常数用于设置Python用于执行名为的异常和循环的堆栈的最大大小blockstack。此限制强加于所有框架对象,并显示frameobject.h中

int blockstack[CO_MAXBLOCKS];       /* Walking the 'finally' blocks */

出现此限制的最可能的原因是在执行嵌套块时将内存使用保持在合理水平。它可能类似于Python对递归调用施加的限制。可以在compile.c中看到此限制:

if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
    PyErr_SetString(PyExc_SyntaxError,
                    "too many statically nested blocks");
    return 0;
}

Michael Hudson在2004年的Python邮件列表信中给出了关于Python为什么有此特定限制以及为什么他们不能摆脱它的更具体的答案:

发现。这与“块栈”有关,这在很大程度上是Python实现的内部细节。我们想摆脱它( 不是 因为我们想让人们编写带有20多个嵌套的for循环的代码:-),但这并不是特别容易(最终:块是最大的问题)。

请注意,在Python 2.6及更低版本中,打破嵌套循环的最大数量将导致SystemError不为SyntaxError。但是,在Python 3中对此进行了更改,并重新修补了Python 2.7,因此SyntaxError将引发a 。在#issue 27514对此进行了记录

问题#27514:使太多静态嵌套的块成为SyntaxError而不是SystemError。

Serhiy Storchaka给出了异常类型发生这种变化的原因:

[…] SystemError不是应该引发的异常。SystemError适用于正常情况下不会发生的错误。只能由错误使用C API或入侵Python内部构件引起。我认为在这种情况下[…] SyntaxError更合适。

python 2022/1/1 18:33:35 有303人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶