为什么我会收到这个错误:RecursionError:超过最大递归深度,在序列化对象时
我在做一个无限循环的程序(纯粹是为了好玩),但遇到了一个错误:“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 个回答
在你写的前五行代码中,它打开了一个叫 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
的目的是为了避免每次都手动关闭文件,但它的表现却是这样的。
为了简化这个过程,可以写一段代码,将一个函数写入文件中,然后导入并运行这个函数。