python shell 在 运行 这段代码时崩溃
The python shell crashs when running this code
我运行这个代码没有成功。
import sys
sys.setrecursionlimit(2147483647)
Gi = 0
def recur():
global Gi
Gi = Gi + 1
recur()
recur()
print(Gi)
input()
我知道改变递归限制是不好的,但是我从没想过这会导致 Shell 崩溃。有人知道为什么吗?
每执行一次recur
,就会在其中执行另一个recur
。当您这样做时,它会不断地添加到调用堆栈中,直到达到系统的内存限制。当它达到该限制时,它将因堆栈溢出而崩溃。
documentation for sys.setrecursionlimit
具体说:
This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python.
The highest possible limit is platform-dependent. A user may need to set the limit higher when they have [...] a platform that supports a higher limit. This should be done with care, because a too-high limit can lead to a crash.
我觉得这很清楚。如果将值设置得太高,可能会崩溃 Python。请注意,文档特别提到崩溃 Python,意思是 Python 解释器,而不仅仅是崩溃 你的程序 .
在 Linux 系统上,您可以使用 ulimit -s
命令更改操作系统堆栈(递归)限制。 ulimit -s unlimited
将提高操作系统对堆栈大小的限制,但您仍然可以通过递归引发崩溃,直到超出计算机中的可用物理内存。
我运行这个代码没有成功。
import sys
sys.setrecursionlimit(2147483647)
Gi = 0
def recur():
global Gi
Gi = Gi + 1
recur()
recur()
print(Gi)
input()
我知道改变递归限制是不好的,但是我从没想过这会导致 Shell 崩溃。有人知道为什么吗?
每执行一次recur
,就会在其中执行另一个recur
。当您这样做时,它会不断地添加到调用堆栈中,直到达到系统的内存限制。当它达到该限制时,它将因堆栈溢出而崩溃。
documentation for sys.setrecursionlimit
具体说:
This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python.
The highest possible limit is platform-dependent. A user may need to set the limit higher when they have [...] a platform that supports a higher limit. This should be done with care, because a too-high limit can lead to a crash.
我觉得这很清楚。如果将值设置得太高,可能会崩溃 Python。请注意,文档特别提到崩溃 Python,意思是 Python 解释器,而不仅仅是崩溃 你的程序 .
在 Linux 系统上,您可以使用 ulimit -s
命令更改操作系统堆栈(递归)限制。 ulimit -s unlimited
将提高操作系统对堆栈大小的限制,但您仍然可以通过递归引发崩溃,直到超出计算机中的可用物理内存。