此限制不仅适用于
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更合适。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)