【问题标题】:Why do I get a RecursionError using either while or if indefinite loops为什么我使用 while 或 if 无限循环得到 RecursionError
【发布时间】:2019-11-18 22:28:04
【问题描述】:

我想创建一个无限期运行的while 循环,直到条件为真。 问题是当条件不成立时,循环只运行大约两分钟,然后中断返回以下错误: RecursionError: maximum recursion depth exceeded in comparison

这是完整的代码:

def request():
    s = requests.Session
    r = s.get(url)
    return r
def data(r):
    soup = BeautifulSoup(r.text, 'lxml')
    list = soup.select('.class')
    return list
def loop(list):
    n = 10
    while True:
        len(list) != n
        if len(list) == n:
            print('Lorem ipsum')
            main()
        else:
            return len(list)
def main():
    r = request()
    list = data(r)
    len(list) = loop(list)

if __name__ == "__main__":
    main()

【问题讨论】:

  • 您可以使用sys 模块来更改最大值。递归:import sys; sys.setrecursionlimit(num)
  • @Ruan 最好让他们识别并修复导致问题的代码中的错误。
  • 听起来你有main 和loop 互相调用直到堆栈溢出。但是你还没有发布main,所以很难知道为什么你这样做了。如果您发布 minimal reproducible example 有人可以提出替代方案。
  • @khelwood 你是对的。 main() 基本上是调用其他函数。我将编辑问题。

标签: python if-statement while-loop


【解决方案1】:

您正在调用函数main(),然后运行main() 中的脚本,这可能是您在上面发布的代码。因此,您创建了一个从不返回任何内容的递归函数。因此,为了避免永远持续下去,python 有一个递归深度限制,这会引发错误。

我不确定您要在这里实现什么,但我认为像这样调用main() 是个坏主意。如果您只是尝试循环通过您的 while 循环而不离开它,您不需要再次调用 main,因为 pythoon 将继续循环通过它,直到不再满足条件。 Please have a look at the documentation on how a while loop works.

请看Recursion。

【讨论】:

  • 为什么这是个坏主意? main() 调用我没有显示的所有其他函数,这意味着如果条件不正确,我想再试一次并调用 main() 调用其他函数等等。而且我不想使用sys.setrecursionlimit(num)。
  • 好吧,您的代码显然永远不会中断循环,从您所展示的内容来看,这是不可能的。我的意思是在你展示的代码中你永远不会改变 list 因此你的条件总是 True 并且你收到错误。我并不是说调用main() 通常是个坏主意,但是无论您想在main() 中调用什么函数,您也可以在循环中调用并再次递归调用您的函数loop 而无需调用@ 987654333@.
  • 我没有发布main(),它调用了其他功能。一个函数执行http 请求,另一个函数解析响应页面并检索一些数据。 list 包含这些数据。基本上,如果不重试,我想检测该列表是否有变化,这就是为什么我一直打电话给main()。
  • 好的,但是你为什么不直接调用函数而不是调用main()呢?此外,每次调用函数loop() 时,您都将list 重新定义为list = ['Lorem ipsum']。因此,您的条件永远不会满足,main() 被不定式调用。
  • 好的,在这种情况下,您的问题只是您将列表设置为的任何数据都不符合您的条件。所以你应该想办法处理这种可能性。否则你的代码看起来不错。除了len(list) != n 这行,因为你没有用它做任何事情,
【解决方案2】:

递归错误说明

函数仅在显式 return 或到达函数代码末尾时(隐式 return None)结束。

当您调用main 时,您还没有完成loop - 它被放入调用堆栈。当main() 返回(完成)时,它会回到loop(正好在main() 行之后)。

但是,就您而言,main 的构造方式可能不会返回并再次调用 loop。因此也将main 放入调用堆栈。

然后loop 再次调用main,然后main 调用loop...它们都没有返回,因此调用堆栈不断增长,直到没有更多内存...像你一样的最大堆栈大小(递归深度)。


无错误说明的无限循环(当您尝试修复上述问题时)

loop 永远不会进入else,因为这里定义了列表,因此总是相同的大小。 这意味着loop 中的while 永远不会中断。 - 列表是一个局部变量,没有调用其他函数会修改它,因为你没有传递对象。

【讨论】:

    【解决方案3】:

    RecursionError 在有循环时引发。当堆栈上的函数调用过多时,会引发 RecursionError。您正在循环无限量的 main() function

    【讨论】:

    • 当条件为真时循环中断,代码不会永远运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多