Python中如何通过递归函数携带变量?

Python中如何通过递归函数携带变量?,python,python-3.x,recursion,Python,Python 3.x,Recursion,我在做一些leetcode问题,发现我不能像我认为的那样通过递归函数传递变量 比如说,我想对一棵树的所有节点求和 所以我想用这种方式来实现它: def Sum(root): def dfs(root,x): if root: dfs(root.left, x) x.append(root.val) dfs(root.right,x) return x return(su

我在做一些leetcode问题,发现我不能像我认为的那样通过递归函数传递变量

比如说,我想对一棵树的所有节点求和

所以我想用这种方式来实现它:

def Sum(root):


    def dfs(root,x):
        if root:
            dfs(root.left, x)
            x.append(root.val)
            dfs(root.right,x)

        return x

    return(sum(dfs(root,x=[])))
这是有效的。但是,假设我想减少内存,为什么这个实现不起作用,只返回根节点呢

def Sum(root):


    def dfs(root,x):
        if root:
            dfs(root.left, x)
            x+=(root.val)
            dfs(root.right,x)

        return x

    return(sum(dfs(root,x=0)))
任何帮助或指导都将不胜感激。

x在您的第一个定义中是可变的;对dfs的每次调用都会获得对同一列表的引用

在第二个示例中,x是不可变的。递归调用不会修改x的值;x+=root.val只更新参数的本地副本

相反,您需要将dfs的返回值直接添加到x

无需定义dfs,因为您不再真正进行一般搜索或漫游。只需递归调用Sum。而且,返回值足够;你根本不需要x参数

def Sum(root):
    if not root:
        return 0
    else:
        return Sum(root.left) + root.val + Sum(root.right)

这回答了你的问题吗?这对我来说是有道理的。谢谢你解释得这么清楚。
def Sum(root):
    if not root:
        return 0
    else:
        return Sum(root.left) + root.val + Sum(root.right)