【问题标题】:Is changing a variable in a recursive call considered mutation在考虑突变的递归调用中更改变量
【发布时间】:2018-08-18 08:26:57
【问题描述】:

我的目标是在不使用突变的情况下对列表求和。

def noMutObj(lst,pointer=0, result=0):
    if pointer == len(lst): 
        return result
    newResult = result + lst[pointer]
    return noMutObj(lst, pointer+1, newResult) 

我们是否会考虑 pointer 在我们进入递归时发生变异, or 变异是否只适用于迭代循环中变化的变量?

【问题讨论】:

  • lst 中的值有变化吗?不?那么就没有突变。
  • (...要清楚,这并不意味着“绑定到名称 lst 的值”,而是“lst 的单个实例中的值”;您可以将不同的列表实例绑定到相同的名称,但如果您不更改单个实例的内容,则不会发生突变)。

标签: python recursion sum mutable mutation


【解决方案1】:

你还没有改变pointer:你已经将一个不同的值传递给每个noMutObj的调用。每个堆栈帧都有自己的pointer,它们都没有改变。即使那样,您也只会更改本地副本。

如果你做了类似的事情,你发生突变

lst.append(newResult)
return noMutObj(lst, pointer+1, newResult)

通话前。相反,将更改后的列表发送到下一个调用的正确方法是

return noMutObj(lst[:].append(newResult), pointer+1, newResult)

... 创建一个新列表,附加 newResult 并将该临时对象传递到下一个级别。

我知道这根本不是您想要的功能;我只是在说明句法和语义原则。

更新

啊……既然我们有了目标……

变异:

def noMutObj(lst):
    if len(lst) == 0: 
        return 0
    return lst.pop() + noMutObj(lst)

没有突变:

def noMutObj(lst):
    if len(lst) == 0: 
        return 0
    return lst[0] + noMutObj(lst[1:])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多