此限制不仅适用于for
循环,但也适用于所有其他控制流块。嵌套控制流块的数量限制在内部定义code.h具有一个名为CO_MAXBLOCKS
:
#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
该常量用于设置 Python 用于执行名为的异常和循环的堆栈的最大大小blockstack
。此限制适用于所有框架对象,并显示在框架对象.h:
int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */
此限制的最可能原因是在执行嵌套块时将内存使用率保持在合理水平。它可能类似于Python 对递归调用施加的限制。可以看出该限制是在编译.c:
if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
PyErr_SetString(PyExc_SyntaxError,
"too many statically nested blocks");
return 0;
}
关于为什么 Python 有这个特定限制以及为什么他们无法摆脱它,给出了更具体的答案Michael Hudson 在 2004 年 Python 邮件列表信件中:
发现。这与“blockstack”有关,它很大程度上是一个内部的
Python 实现的详细信息。我们想摆脱它(not因为我们想让人们编写超过20个嵌套的代码
循环:-)但这并不是特别容易(最后:块是
最大的问题)。
请注意,在 Python 2.6 及更低版本中,打破嵌套循环的最大数量会导致SystemError
not a SyntaxError
。然而,这在 Python 3 中发生了变化,并回补到 Python 2.7,因此SyntaxError
将会被提高。这被记录在#问题 27514:
问题 #27514:使过多的静态嵌套块成为 SyntaxError
而不是系统错误。
异常类型发生这种变化的原因由谢尔希·斯托查卡:
[...] SystemError 不是应该引发的异常。 SystemError 是指正常情况下不会发生的错误。它应该只是由于不正确使用 C API 或破解 Python 内部结构造成的。我认为 SyntaxError 在这种情况下更合适 [...]。