在递归调用中更改变量被视为变异

时间:2018-03-09 17:41:44

标签: python recursion sum mutable mutation

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

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

当我们进入递归步骤时,我们会考虑pointer变异吗? 突变是否只适用于在迭代循环中变化的变量?

1 个答案:

答案 0 :(得分:2)

您尚未发生变异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:])