9

我想要做的是递归处理一个列表。我是 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

我该如何解决这种情况,我理解错了什么?

4

2 回答 2

9

函数的所有递归调用都在同一个列表上运行。你需要复制一份:

def recur(n):
    n.append(len(n))
    print '>',n
    if n[-1]<5: recur(n[:])  # <<<< Note the [:]
    print '<',n

How do I pass a variable by reference?的答案中有一些很好的解释。

于 2013-01-03T21:03:14.777 回答
3

正如其他答案所示,您正在更改列表。您可以制作列表的副本和/或使用不可变的数据结构,例如元组:

def recur(n=()):
    if len(n) > 4:
         return n
    return recur(n + (len(n),))
于 2013-01-03T21:08:07.013 回答