python方法无限期地调用自身是否可以

时间:2015-08-02 13:41:51

标签: python tail-recursion

我有一个python方法,可以不时执行某些任务。 我发现最简单的方法是写:

class MyClass:
    def a(self):
        #perform the task 
        time.sleep(time_to_sleep)
        self.a()

但该方法应该运行很长时间,可能持续数月,这意味着它可以递归调用方法达10 ^ 4次。

这样做有风险吗?

2 个答案:

答案 0 :(得分:6)

如果您无限期地继续进入您的函数,迟早会出现以下错误 -

RuntimeError: maximum recursion depth exceeded

一个简单的例子来展示这个 -

>>> def a():
...     global i
...     i += 1
...     a()

然后我使用as -

运行此功能
>>> i = 0
>>> a()

这给了我上面的错误,之后当我打印i的值时它是999.所以迟早你会得到那个错误。

您也可以通过调用sys.setrecursionlimit()来更改此限制,但我不会建议这样做,因为您可能会在达到限制之前结束堆栈(更简单的方法是使用while循环如下面答案中所示) -

import sys
sys.setrecursionlimit(<limit>)

或者你也可以得到 - MemoryError - 如果你在本地命名空间中存储大量数据,因为你永远不会从递归调用中返回,所以调用函数的本地命名空间永远不会被清除。所以,在你达到最大递归限制之前,你甚至可以最终炸毁你的记忆。

您尝试做的简单方法是使用while循环,例如 -

class MyClass:
    def a(self):
        while True:
            #perform the task 
            time.sleep(time_to_sleep)

答案 1 :(得分:4)

都能跟得上!
递归函数有一个调用限制。如证明,您可以看到自己修改sys.setrecursionlimit

import time, sys
# max calls: 3
sys.setrecursionlimit(3)

class MyClass:
    def a(self):        
        print "."
        time.sleep(1)
        self.a()

m = MyClass()
m.a()

当通话次数达到3时,您可以看到: RuntimeError:

.
.
Traceback (most recent call last):
  File "teste.py", line 14, in <module>
    m.a()
  File "teste.py", line 11, in a
    self.a()
  File "teste.py", line 11, in a
    self.a()
RuntimeError: maximum recursion depth exceeded

只是为了注意你可以得到这样的递归限制:

>>> import sys
>>> sys.getrecursionlimit()
  

另外,请注意:如果设置得太高而且太高了   sys.getrecursionlimit(),您可能会导致C堆栈溢出,   使Python解释器失败。