我的目标是在不使用变异的情况下对列表求和。
def noMutObj(lst,pointer=0, result=0):
if pointer == len(lst):
return result
newResult = result + lst[pointer]
return noMutObj(lst, pointer+1, newResult)
当我们进入递归步骤时,我们会考虑pointer
变异吗?
或突变是否只适用于在迭代循环中变化的变量?
答案 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:])