Python:函数始终返回None

时间:2013-04-03 13:40:20

标签: python return

我有一些基本上看起来像这样的Python代码:

my_start_list = ...

def process ( my_list ):
    #do some stuff

    if len(my_list) > 1:
        process(my_list)
    else:
        print(my_list)
        return my_list

print(process(my_start_list))

奇怪的是: print(my_list)打印出正确的内容。但是,打印函数返回值的第二个print语句始终打印“None”。 即使我用 return(“abc”)替换正常的return语句,它仍然是None。

由于变量的内容在return语句之前似乎是正确的一行,我不知道从哪里开始调试。 是否存在可能导致此问题的常见问题?

4 个答案:

答案 0 :(得分:9)

当你有1或0个元素(基本情况)时,你只返回列表。在第一个块中也需要一个return语句,在那里进行递归调用,否则你深入到基本情况,将length-1列表返回到下一个级别,然后返回None其余的的方式。所以你想要的是这样的,而不是:

def process(my_list):
    # Do some stuff.
    if len(my_list) > 1:
        return process(my_list) #If you don't return this result, you return None
    else:
        print(my_list)
        return my_list

现在每个案例(不仅仅是基本案例)都有一个返回值,因此返回值将一直传播回初始调用。

答案 1 :(得分:9)

以下是发生的事情:

  1. 您致电process(my_start_list)
  2. 在函数中,如果if,则执行len(my_list) > 1块,并且那里没有return语句。现在,由于else尚未执行,因为这是您拥有return子句的唯一位置,所以返回默认值None
  3. 如果列表中包含0或1个元素,则返回该列表。
  4. 要解决此问题,您需要返回process(my_list)返回的列表。

    那是:

    def process(my_list):
        # do some stuff
        ...
        if len(my_list) > 1:
            return process(my_list)
        else:
            print(my_list)
            return my_list
    

答案 2 :(得分:3)

你递归地调用process但是当你这样做时永远不会忽略它的返回值。添加return语句到传递返回值::

def process ( my_list ):
    #do some stuff

    if len(my_list) > 1:
        return process(my_list)
    else:
        print(my_list)
        return my_list

现在,当len(my_list) > 1True时,您实际上传递了递归调用的返回值。

答案 3 :(得分:2)

正如其他人所指出的,你错过了return陈述。

我个人会将尾递归转换为迭代:

def process(my_list):
    while True:
        # do some stuff
        if len(my_list) <= 1:
            return my_list

我认为这使得意图更加清晰,并且还避免了一些pitfalls associated with tail recursion