python不能正确退出程序

python不能正确退出程序,python,recursion,Python,Recursion,在我的程序中,我想和用户互动,让他按特定的字母来做一些事情(我认为这个游戏的逻辑与我的问题无关)。当我开始游戏时,作为第一个字母,我立即按“q”退出程序,但当我玩了一段时间(使用几次“g”和“r”)后,我也必须按几次“q”才能退出程序(每次我都会收到与游戏开始时相同的提示“输入g开始…”) 我使用的是Canopy和Python 2.7 t_h = '' def pg(wl): global t_h result = raw_input("Enter g to start ne

在我的程序中,我想和用户互动,让他按特定的字母来做一些事情(我认为这个游戏的逻辑与我的问题无关)。当我开始游戏时,作为第一个字母,我立即按“q”退出程序,但当我玩了一段时间(使用几次“g”和“r”)后,我也必须按几次“q”才能退出程序(每次我都会收到与游戏开始时相同的提示“输入g开始…”) 我使用的是Canopy和Python 2.7

t_h = '' 
def pg(wl):

    global t_h
    result = raw_input("Enter g to start new game, r to replay last game, or q to end game: ")
    possible_choices = ["g", "r", "q"]
    if result in possible_choices:
        if result == 'g':
            t_h = dh(n)
            ph(t_h, wl, n)
        if result == 'r':
            if t_h == '':
                print 'You have not played a game yet. Please play a new game first!'
            else:
                ph(t_h, wl, n)
        if result == 'q':
            return None
    else:
        print "Invalid letter." 
    return pg(wl)

如果看不到更多的代码(特别是为
dh
ph
编写的代码),就很难判断,但我猜
pg
是从这些函数中的一个或代码中的其他函数调用的。

函数
pg
在任何非
可能选择的情况下递归调用自己(因为只有
q
直接返回)——也就是说,在
返回pg(wl)
行上

您描述的情况意味着
ph
dh
中的一个或两个正在再次调用
pg
。 这意味着,对于每个非
q
输入,您将在堆栈上从
ph
(或
ph
dh
)提示一个新问题一个来自对
pg
的递归调用。这将导致您描述的确切行为,其中一个
q
不足以退出。对于您发布的代码,即没有
dh
ph
,不可能精确地知道,但这是合乎逻辑的结论

如果希望立即退出,则必须在
q
情况下使用带有
break
的简单无限循环,而不是递归。
另一种可能是@PauloScardine使用
exit()
的想法,如果您真正想退出整个过程。同样,对于您发布的代码片段,不可能知道这是否可行(
pg
直接从
main
函数调用).

您正在递归调用函数。每个递归都需要一个
q
才能退出。用循环替换递归。ctrl+c始终有效:使用
exit()替换
return None
。这是不准确的:无论
ph
做什么,递归已经存在,因为在所选字母的
if
块的末尾,会再次调用
pg
,除非按下
q
。如果
ph
调用
pg
,则递归来自不同的源,但即使也会出现这种情况de>ph
没有。据我所知,递归调用只是作为一个转到。尝试从hoodoo的代码中删除非递归调用并运行它。当您第一次给它一个
q
时,它将退出。您实际上是对的,尽管我不会将递归调用称为转到。我调整了我的答案以反映这一点。您是对的假设其他函数也调用pg。我注意到我在某些情况下将return语句放在了ph中。它单独工作很好,但导致了奇怪的行为,正如我在上面开始使用pg时所描述的。现在它在pg中没有调用也可以工作。感谢您的帮助以及本主题中涉及的ppl的其他部分。