代码在返回值之前撤消自身

Code undoes itself before returning value

from time import sleep
def refit(i, n, c=[]):
 sleep(1)
 print(c)
 if i[:n] != '': refit(i[n:],n,c+[i[:n]])
 sleep(1)
 print(c)
 return c

使用参数“Hello”和 2 时的输出:

[]
['He']
['He', 'll']
['He', 'll', 'oo']
['He', 'll', 'oo']
['He', 'll']
['He']
[]
[]

应该打印并返回数组 ['He'、'll'、'oo'],但代码正在自行撤消。 怎么了?我很困惑。

在对 refit 的给定调用中,您没有更改 c,因此 c 在第二个 print() 中具有与在第二个 print() 中相同的值首先print()。所有递归调用都发生在这两个 print 调用之间。

第一次调用时,c[]:

# i = 'Helloo', n = 2, c = []
print(c)  # prints "[]"
if i[:n] != '':
    refit(i[n:],n,c+[i[:n]])  # prints a bunch of other stuff
print(c)  # prints "[]"
return c  # returns []

在第二次调用 refit 时(上面用 # prints a bunch of other stuff 表示)我们做:

# i = 'lloo', n = 2, c = ['He']
print(c)  # prints "['He']"
if i[:n] != '':
    refit(i[n:],n,c+[i[:n]])  # prints even more stuff
print(c)  # prints "['He']"
return c  # returns ["He"]

到目前为止我们的输出如下:

[]
['He']
(more stuff will go here)
['He']
[]

如此不断——每次新的递归调用都会在前一次调用的中间添加另一对 print 语句。并且每次调用 return 都是其 原始 c,而不是它从刚刚对 refit 进行的递归调用中获得的新值。

如果你想让这个函数return最内层调用的结果,那么它只需要return调用refit的结果:

def refit(i, n, c=[]):
    return refit(i[n:], n, c + [i[:n]]) if i[:n] else c

print(refit("Helloo", 2))  # ['He', 'll', 'oo']

您是要将递归调用中的 return 值保存到 refit() 吗?

def refit(i, n, c=[]):
    if i[:n] != '':
        c = refit(i[n:], n, c+[i[:n]])
    return c

c = refit('Helloo',2)
print(c)

按要求输出