在爬取某个网页的时候遇到了这个问题:
Fatal Python error: Cannot recover from stack overflow
我问题所在:使用函数时递归调用次数过多(800左右会出现),导致栈溢出。
在Python中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,相当于一次push压栈操作,每当函数返回,相当于一次pop出栈操作。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
Windows程序的内存机制大概是这样的,全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;函数地址、函数参数、局部变量等信息存储于栈内存,栈内存较小容易发生溢出现象,但是效率高。
栈溢出的可能原因: 1. 函数递归调用层次过深 ,每调用一次,函数的参数、局部变量等信息就压一次栈,并且没有及时出栈。 2. 局部变量体积太大
可以通过下面这张图来辅助我们理解,当栈的空间接近被占完时,会发生溢出现象
解决方案: 1.把递归调用函数改用while或者for循环来实现 。 2.通过尾递归优化。 3.改用堆内存,函数里定义很大的局部变量(例如大数组),这种情况可以将局部变量改为静态变量(实质上也是全局变量)。 4.增大栈的大小值。
参考文章:https://blog.csdn.net/zcyzsy/article/details/77151709 https://stackoverflow.com/questions/40963288/fatal-python-error-cannot-recover-from-stack-overflow-during-flood-fill https://blog.csdn.net/qq_34178562/article/details/78198755 https://blog.csdn.net/xc889078/article/details/8796880