This question already has answers here:
Return in Recursive Function
                                
                                    (3个答案)
                                
                        
                                3年前关闭。
            
                    
Python版本:2.7。操作系统:Windows 10 64-bit。

注意:我找到了一种解决以下问题的方法,该方法不使用try / except / else语句。我问以下问题仅是因为我很好奇为什么代码会按照其行为方式运行,以及是否有一种方法可以使用try / except / else来完成我想做的事情。

我有一个名为blah.py的文件,其中包含以下代码:

import os

def makeFolder(dirName, num = 0):
    try:
        os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists
    except:
        makeFolder(dirName, num = num + 1)
    else:
        return dirName + '_' + str(num)


现在,我进入Powershell,然后输入:

import blah
myStr = blah.makeFolder('myFolder')
print myStr
print type(myStr)


它确实完成了我所期望的-创建了一个名为myFolder_0的文件夹,并打印了myFolder_0<type 'str'>。现在,仍然在Powershell中,键入:

myStr1 = blah.makeFolder('myFolder')
print myStr1
print type(myStr1)


这次,正如我期望的那样,它将创建一个名为myFolder_1的文件夹,但它不会打印myFolder_1<type 'str'>,而是打印None<type 'NoneType'>。以后每次使用blah.makeFolder('myFolder')时,它将继续执行此操作。

如果将我在Powershell中键入的命令放在脚本内,则行为也很奇怪。我制作了一个名为blah2.py的文件,该文件与blah.py相同,但是最后有一个脚本:

import os

def makeFolder(dirName, num = 0):
    try:
        os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists
    except:
        makeFolder(dirName, num = num + 1)
    else:
        return dirName + '_' + str(num)

myStr = makeFolder('myFolder')
print myStr
print type(myStr)

myStr1 = makeFolder('myFolder')
print myStr1
print type(myStr1)


然后在Powershell中:

python blah2.py


这次,它使myFolder_0并打印myFolder_0<type 'str'>(因此myStr块与blah.py相同),然后进行无限递归(因此myStr1块不起作用)。因此出于我不理解的原因,其行为与交互式会话期间的行为有所不同。如果再次键入python blah2.py,它将生成myFolder_1并打印None<type 'NoneType'>myStr块),然后再次进入无限递归(myStr1块)。

为什么脚本的行为与交互式会话不同,为什么脚本中会发生无限递归,并且我的代码版本是否仍然使用try / except / else但可以正常工作?

最佳答案

如果我在递归调用中添加return,那么您的代码对我来说效果很好:

import os

def makeFolder(dirName, num = 0):
    try:
        os.mkdir(dirName + '_' + str(num))
    except OSError:
        return makeFolder(dirName, num = num + 1)
    else:
        return dirName + '_' + str(num)

print(makeFolder('myFolder')) # myFolder_0
print(makeFolder('myFolder')) # myFolder_1


至于为什么看到自己看到的东西……肯定还有其他事情在发生。您为blah2.py共享的代码无法正常工作,因为在任何地方都没有定义blah。我的猜测是您正在运行不同的代码而没有意识到。 (也许文件在不同目录中的不同副本?)

07-24 18:10
查看更多