python方法可以无限期地调用自己吗
我有一个python方法,它会不时执行一些任务。 我发现最简单的方法是写:python方法可以无限期地调用自己吗,python,tail-recursion,Python,Tail Recursion,我有一个python方法,它会不时执行一些任务。 我发现最简单的方法是写: class MyClass: def a(self): #perform the task time.sleep(time_to_sleep) self.a() 但是这个方法应该运行很长时间,可能几个月,这意味着它的方法可以递归调用10^4次 这样做有风险吗?如果无限期地继续递归到函数中,迟早会出现以下错误- RuntimeError: maximum recu
class MyClass:
def a(self):
#perform the task
time.sleep(time_to_sleep)
self.a()
但是这个方法应该运行很长时间,可能几个月,这意味着它的方法可以递归调用10^4次
这样做有风险吗?如果无限期地继续递归到函数中,迟早会出现以下错误-
RuntimeError: maximum recursion depth exceeded
一个简单的例子来说明这一点-
>>> def a():
... global i
... i += 1
... a()
然后我使用as运行这个函数-
>>> i = 0
>>> a()
这给了我上面的错误,之后当我打印I
的值时,它是999。所以你迟早会犯这个错误
您也可以通过调用来更改此限制,尽管我不建议这样做,因为您可能在达到限制之前就结束了堆栈(更简单的方法是使用while循环,如下所示)-
简而言之:不递归函数有一个调用限制。正如所证明的,您可以看到自己正在修改: 当呼叫数达到3时,您将看到: 运行时错误:
.
.
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
另外,请注意:设置的值太高且超过
sys.getrecursionlimit(),可能会导致C堆栈溢出,
制作Python解释器失败
我想使用while循环会更容易,并且避免潜在的破坏堆栈,你到底在做什么?OP声明该方法最多会调用自己10**4次,您可以将recursionlimit设置为10**4,这样他们就不一定会得到超过最大递归深度的错误。他说-
但该方法应该运行很长时间,可能会运行数月,这意味着它的方法最多可以递归调用10^4次。
-我没有看到他将其限制为10**4
。不管怎样,这是个坏主意,检查一下关于记忆错误的第二部分。我说这是个好主意吗?我说有一个限制,它可以改变,这在你的答案中是没有的。
class MyClass:
def a(self):
while True:
#perform the task
time.sleep(time_to_sleep)
import time, sys
# max calls: 3
sys.setrecursionlimit(3)
class MyClass:
def a(self):
print "."
time.sleep(1)
self.a()
m = MyClass()
m.a()
.
.
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()