Python:最大递归深度

2 投票
4 回答
5931 浏览
提问于 2025-04-17 00:30

下面是一个函数,它的作用是返回传入参数的大小总和。这些参数可以是单个文件、文件夹,或者是文件和文件夹的列表。不过,当我尝试测试这个代码时,它出现了一个错误信息:RuntimeError: maximum recursion depth exceeded while calling a Python object

我该怎么解决这个问题呢?

谢谢

suresh

#!/usr/bin/python3.1
import os

def fileSizes(f):
    if hasattr(f,'__iter__'):
        return sum(filter(fileSizes,f))
    if os.path.isfile(f):
        return os.path.getsize(f)
    elif os.path.isdir(f):
        total_size = os.path.getsize(f)
        for item in os.listdir(f):
            total_size += fileSizes(os.path.join(f, item))
        return total_size

4 个回答

3

我上次查看时,默认的最大递归深度是1000。你有几个选择:

  1. 使用Stackless Python,它没有递归限制(可以无限递归)。
  2. 把你的函数改写成迭代的方式,而不是递归,这样就不会一开始就溢出栈。
  3. 通过sys.setrecursionlimit来设置最大递归限制。不过要小心,如果设置不当可能会导致程序崩溃。
9

与其自己写一个临时的目录遍历方法,不如使用内置的 os.walk 方法,具体可以查看 文档

实际上,文档中的例子(上面的链接)可以计算出非目录文件的总大小。

1

问题出在这一行:

if hasattr(f,'__iter__'):
    return sum(filter(fileSizes,f))

因为 f 是一个路径,它其实是一个字符串,并且它有一个叫 __iter__ 的属性,所以你在这里会无限循环。

撰写回答