Pio*_*ski 1 python syntax python-2.7
为什么这段代码给我一个语法错误:
eval(1485*'not ' + '1')
Run Code Online (Sandbox Code Playgroud)
显然语法是正确的.1485以下的工作正常.而1496及以上我得到了内存错误.我认为应该引发MemoryError而不是SyntaxError.
解析器有限制,你正在击中它们.有关讨论,请参阅http://bugs.python.org/issue1881,但您设法在其中添加足够的not运算符以用尽解析器堆栈空间.
您可以通过嵌套列表达到相同的限制,请参阅http://bugs.python.org/issue215555:
>>> eval(100 * '[' + 100 * ']')
s_push: parser stack overflow
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
Run Code Online (Sandbox Code Playgroud)
引用后一份报告:
有一个基于C堆栈的限制,因为解析器是递归下降的.
提供达到该限制的代码也被视为语法错误; 例如not,连续1485个操作符是疯狂的,不可能被认为是有效的Python.:-)
你得到一个EOF错误而不是MemoryError一定长度的原因很简单,因为tokenizer设法到达行的末尾(并发出EOF信号)表示这些长度,然后解析器堆栈溢出,而不是解析器堆栈在令牌生成器看到行结束之前溢出.