我有一些基本上看起来像这样的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语句之前似乎是正确的一行,我不知道从哪里开始调试。 是否存在可能导致此问题的常见问题?
答案 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)
以下是发生的事情:
process(my_start_list)
。if
,则执行len(my_list) > 1
块,并且那里没有return语句。现在,由于else
尚未执行,因为这是您拥有return子句的唯一位置,所以返回默认值None
。要解决此问题,您需要返回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) > 1
为True
时,您实际上传递了递归调用的返回值。
答案 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。