我要做的是以递归方式处理列表。我是python的新手,所以当所有代码都被编写并发送执行时,我遇到了一个奇怪的问题:在调用递归函数后,列表返回了更改。为了测试这个,我写道:
def recur(n):
n.append(len(n))
print '>',n
if n[-1]<5: recur(n)
print '<',n
并且调用了函数:
recur([])
结果如下:
> [0]
> [0, 1]
> [0, 1, 2]
> [0, 1, 2, 3]
> [0, 1, 2, 3, 4]
> [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
我期望看到的是
> [0]
> [0, 1]
> [0, 1, 2]
> [0, 1, 2, 3]
> [0, 1, 2, 3, 4]
> [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4]
< [0, 1, 2, 3]
< [0, 1, 2]
< [0, 1]
< [0]
,就像简单的整数变量一样:
def recur(n):
n=n+1
print '>',n
if n<5: recur(n)
print '<',n
recur(0)
> 1
> 2
> 3
> 4
> 5
< 5
< 4
< 3
< 2
< 1
我如何解决这种情况以及我理解错误的内容?
答案 0 :(得分:9)
您的函数的所有递归调用都在同一列表上运行。你需要复制一份:
def recur(n):
n.append(len(n))
print '>',n
if n[-1]<5: recur(n[:]) # <<<< Note the [:]
print '<',n
的答案有一些很好的解释
答案 1 :(得分:2)
正如其他答案所示,您正在改变列表。您可以制作列表的副本和/或使用不可变的数据结构,如元组:
def recur(n=()):
if len(n) > 4:
return n
return recur(n + (len(n),))