为什么我会收到这个错误:RecursionError:超过最大递归深度,在序列化对象时

0 投票
1 回答
58 浏览
提问于 2025-04-14 18:06

我在做一个无限循环的程序(纯粹是为了好玩),但遇到了一个错误:“RecursionError: maximum recursion depth exceeded while pickling an object”,后面还有这条信息:

Traceback (most recent call last):
  File "<pyshell#34>", line 2, in <module>
    exec(p.read())
  File "<string>", line 6, in <module>
  File "<string>", line 6, in <module>
  File "<string>", line 6, in <module>
  [Previous line repeated 503 more times]
  File "<string>", line 4, in <module>
RecursionError: maximum recursion depth exceeded while pickling an object

我没有导入任何与“pickling”相关的模块,我也不知道为什么会出现这个错误。

我在Python解释器里运行了这段代码:

with open("Cool.py", "a")as p1:
    p1.write("""for _ in range(10):\n\t""")
    p1.write("""with open("Cool.py" "r")as p1:\n""")
    p1.write("""\t\tfor b in p1:\n""")
    p1.write("""\t\t\tprint(b)""")

我在我的文档文件夹里有一个空的.py文件,叫做“Cool.py”(我是Mac用户)。在运行了上面的代码后,我又运行了这段代码来调用这个文件,而不需要打开它:

with open("Cool.py") as p:
    exec(p.read())

我知道这样有点懒,但我主要是好奇为什么会提到“pickle”模块。有没有人能解释一下我为什么会遇到这个错误(虽然怎么解决这个问题就没那么重要了)。

1 个回答

0

在你写的前五行代码中,它打开了一个叫 cool.py 的文件,并写入了以下内容。(请注意,在这一行 p1.write("""with open("Cool.py" "r")as p1:\n""") 中,你漏掉了一个逗号。正确的写法应该是 p1.write("""with open("Cool.py", "r")as p1:\n""")。我还在最后一行加了 \n,这样可以看看会发生什么。

**#assume this is code_1**
for _ in range(10):
    with open("Cool.py", "r")as p1:
        for b in p1:
            print(b)

现在你正在执行以下代码:

**#Assume this is code_2**
with open("Cool.py") as p:
    exec(p.read())

通过这段代码 exec(p.read()),你是在请求执行读取到的代码。也就是说,代码_1 将作为 Python 代码被执行(想知道代码_1 是什么,可以看看我的评论)。在这里,你请求打开同一个文件十次。但事情并没有结束。

每次打开文件时,代码_2 会执行文件中的代码_1,因为它是 with open 的形式(隐藏的意思是:如果文件被打开,就执行里面的代码)。而且每次都需要打开同一个文件十次,每次打开时,代码都会被执行。这是一个无尽的过程。

虽然 with open 的目的是为了避免每次都手动关闭文件,但它的表现却是这样的。

为了简化这个过程,可以写一段代码,将一个函数写入文件中,然后导入并运行这个函数。

撰写回答