调用python对象时超出了python最大递归深度

2024-04-18 18:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我做了一个脚本,基本上是相加,然后把数字转换成ascii码。它可以工作一点,但是运行一段时间后,我得到了一个错误:调用Python对象时超过了最大递归深度。我根本不明白这是什么意思。。。我的代码是:

letter1=0
letter2=0
letter3=0
def first():
    global letter1
    letter1+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    if letter1==127:
        second()
    else:
        first()
def second():
    global letter1
    global letter2
    letter2+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    letter1=0
    if letter2==127:
        third()
    else:
        first()
def third():
    global letter1
    global letter2
    global letter3
    letter1=0
    letter2=0
    letter3+=1
    print(chr(letter1), chr(letter3), chr(letter3))
    if letter3==127:
        print("\n\n\n\n\n\n\n\n\n\n")
    else:
        first()
first()

Tags: 脚本ifdefascii数字globalelsefirst
2条回答

您超出了递归深度限制。要更改深度限制,请参阅以下问题:Python: Maximum recursion depth exceeded。但是,即使这样也帮不了你,因为你打电话的数量非常大。在你的每一个函数完成之前,它会调用另一个(或它自己),所以这就是使你的程序递归的原因。每次调用函数时,函数及其参数都以帧的形式添加到计算机堆栈中。每次从函数返回时,帧都会从堆栈中移除。所以,当您在返回之前调用另一个函数时,堆栈的深度(递归深度)增加了1。旁注:即使没有指定return语句,Python也会在函数末尾自动返回None。在

函数首先将递归深度设为128(大但仍起作用)。添加第二个函数会将深度增加到(128*128或16384)要完成此操作,必须增加递归深度。试试这段代码,当字母3第一次增加时,你会发现它停止了。根据您的计算机,它甚至可能无法达到字母3的第一次增加,这会让您知道您有多少函数调用(这非常适合本网站的标题,堆栈溢出)。在

顺便说一句,不建议使用全局变量,所以我为您更改了它。在

import sys
sys.setrecursionlimit(16385)

def first(letter1, letter2, letter3):
    letter1+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    if letter1==127:
        second(letter1, letter2, letter3)
    else:
        first(letter1, letter2, letter3)

def second(letter1, letter2, letter3):
    letter2+=1
    print(chr(letter1), chr(letter2), chr(letter3))
    letter1=0
    if letter2==127:
        third(letter1, letter2, letter3)
    else:
        first(letter1, letter2, letter3)

def third(letter1, letter2, letter3):
    letter1=0
    letter2=0
    letter3+=1
    print(chr(letter1), chr(letter3), chr(letter3))
    if letter3==127:
        print("\n\n\n\n\n\n\n\n\n\n")
    else:
        first(letter1, letter2, letter3)

letter1=0
letter2=0
letter3=0
first(letter1, letter2, letter3)

现在16384是第二个函数的深度。加上第三个,它(128*128*128或2097152)对于递归来说太大了。所以我建议你不要使用递归。尝试使用嵌套的for loops。例如:

^{pr2}$

请注意,这仍然需要一段时间,因为它正在生成128^3个打印语句。在

每次调用函数时,都会将一个帧添加到调用堆栈中,并且调用堆栈上的帧数是有限制的。当超过该限制时,会出现递归深度超出错误。在

在您的代码中,有127个first()帧放在堆栈上,然后127**2first()和{}对帧放到堆栈上,然后在堆栈展开之前将127**3first()second()和{}三元组帧放到堆栈上。总共有2064639帧。在

相关问题 更多 >