【问题标题】:python: recurcive list processing changes original listpython:递归列表处理更改原始列表
【发布时间】:2012-12-18 07:16:40
【问题描述】:

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

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

【问题讨论】:

  • 你的问题“python:递归列表处理”不是问题。
  • @PhilFrost,但是“我该如何解决这种情况,我理解错了什么?”是一个问题。
  • @StoryTeller:我不知道你是否在讽刺。我并不是说这是一个坏问题。我是说顶部的大标题不是一个问题。这很重要,因为当有人对他们的列表如何变异感到困惑时,他们不会去搜索“递归列表处理”。他们可能会搜索诸如“为什么每次调用函数时我的列表都会改变?”
  • @PhilFrost,您的批评不明确,似乎不公正。我不认为标题必须被表述为问题,但我同意它应该与问题更密切相关。希望我的编辑有所改进。

标签: python list recursion


【解决方案1】:

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

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?的回答中有一些很好的解释

【讨论】:

    【解决方案2】:

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

    def recur(n=()):
        if len(n) > 4:
             return n
        return recur(n + (len(n),))
    

    【讨论】:

      猜你喜欢
      • 2015-12-07
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多