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

one*_*ach 0 python tail-recursion

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

class MyClass:
    def a(self):
        #perform the task 
        time.sleep(time_to_sleep)
        self.a()
Run Code Online (Sandbox Code Playgroud)

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

这样做有风险吗?

Ana*_*mar 6

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

RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)

一个简单的例子来说明这一点 -

>>> def a():
...     global i
...     i += 1
...     a()
Run Code Online (Sandbox Code Playgroud)

然后我使用as运行此功能 -

>>> i = 0
>>> a()
Run Code Online (Sandbox Code Playgroud)

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

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

import sys
sys.setrecursionlimit(<limit>)
Run Code Online (Sandbox Code Playgroud)

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


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

class MyClass:
    def a(self):
        while True:
            #perform the task 
            time.sleep(time_to_sleep)
Run Code Online (Sandbox Code Playgroud)