栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

此限制不仅适用于

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

#define CO_MAXBLOCKS 20 

此常数用于设置Python用于执行名为的异常和循环的堆栈的最大大小

blockstack
。此限制强加于所有框架对象,并显示在frameobject.h中:

int blockstack[CO_MAXBLOCKS];       

出现此限制的最可能的原因是在执行嵌套块时将内存使用保持在合理水平。它可能类似于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更合适。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/638289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号