代码在返回值之前撤消自身
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)
按要求输出
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)
按要求输出