递归中的python列表是否不会更改为以前的值?

递归中的python列表是否不会更改为以前的值?,python,list,recursion,Python,List,Recursion,假设这是我的函数,它通过dfs生成一棵树,并且有一个名为c的变量用于存储节点数和一个列表调用te。我的树是{1:[2,3],2:[1],3:[1]} 根是1。te=[1]c=1 根是2。te=[1,2]c=2 根是3te=[1,2,3]c=2。我的函数是dfs(i,te,c),可以明显地回滚到c,但列表没有变成[1,3] def dfs(节点、已访问、te、c=0): 如果访问[节点]==0: 已访问[节点]=1 附加(节点) c=c+1 印刷品(te) 如果节点位于king中: 对于内仁王[节

假设这是我的函数,它通过dfs生成一棵树,并且有一个名为c的变量用于存储节点数和一个列表调用te。我的树是{1:[2,3],2:[1],3:[1]} 根是1。te=[1]c=1 根是2。te=[1,2]c=2 根是3te=[1,2,3]c=2。我的函数是dfs(i,te,c),可以明显地回滚到c,但列表没有变成[1,3]

def dfs(节点、已访问、te、c=0):
如果访问[节点]==0:
已访问[节点]=1
附加(节点)
c=c+1
印刷品(te)
如果节点位于king中:
对于内仁王[节点]:
如果访问[nei]==0:
dfs(未访问、访问、te、c)

列表
传递给函数时,不是传递列表的副本,而是传递对列表的引用。您在函数中对该列表所做的任何更改都将反映在引用该列表的其他地方。

当您将
列表传递给函数时,您并没有传递列表的副本,而是传递了对该列表的引用。在函数中对该列表所做的任何更改都将反映在引用该列表的其他地方。

如果向列表中添加and元素,则在使用
pop
方法处理后,可能必须将其删除。

如果向列表中添加and元素,使用
pop
方法处理后,您可能必须将其删除。

值在递归过程中不会“更改回”以前的值。由于整数是不可变的,因此在每个递归步骤中为它们分配一个新值(替换旧值):
c=c+1
。由于列表是可变的,它们可以在每个递归步骤中将一个元素附加到现有值(修改旧值):
te.append(node)

最简单的更改是为列表创建并分配一个新值:

def dfs(node,visited,te,c=0):
    if visited[node]==0:
        visited[node]=1
        te = te + [node]  # create new list on each recursive step
        c = c + 1
        print(te)
        if node in king:
            for nei in king[node]:
                if visited[nei]==0:
                    dfs(nei, visited, te, c)
这种错误可以通过使用元组而不是列表来避免。元组不能追加到

或者,在传递列表时创建副本:

def dfs(node,visited,te,c=0):
    if visited[node]==0:
        visited[node]=1
        te.append(node)
        c = c + 1
        print(te)
        if node in king:
            for nei in king[node]:
                if visited[nei]==0:
                    # copy mutable value before passing it on
                    dfs(nei, visited, te.copy(), c)
或在完成后删除附加值:

def dfs(node,visited,te,c=0):
    if visited[node]==0:
        visited[node]=1
        te.append(node)
        c = c + 1
        print(te)
        if node in king:
            for nei in king[node]:
                if visited[nei]==0:
                    dfs(nei, visited, te, c)
        te.pop()  # remove previously appended element
在递归过程中,值永远不会“更改回”以前的值。由于整数是不可变的,因此在每个递归步骤中为它们分配一个新值(替换旧值):
c=c+1
。由于列表是可变的,它们可以在每个递归步骤中将一个元素附加到现有值(修改旧值):
te.append(node)

最简单的更改是为列表创建并分配一个新值:

def dfs(node,visited,te,c=0):
    if visited[node]==0:
        visited[node]=1
        te = te + [node]  # create new list on each recursive step
        c = c + 1
        print(te)
        if node in king:
            for nei in king[node]:
                if visited[nei]==0:
                    dfs(nei, visited, te, c)
这种错误可以通过使用元组而不是列表来避免。元组不能追加到

或者,在传递列表时创建副本:

def dfs(node,visited,te,c=0):
    if visited[node]==0:
        visited[node]=1
        te.append(node)
        c = c + 1
        print(te)
        if node in king:
            for nei in king[node]:
                if visited[nei]==0:
                    # copy mutable value before passing it on
                    dfs(nei, visited, te.copy(), c)
或在完成后删除附加值:

def dfs(node,visited,te,c=0):
    if visited[node]==0:
        visited[node]=1
        te.append(node)
        c = c + 1
        print(te)
        if node in king:
            for nei in king[node]:
                if visited[nei]==0:
                    dfs(nei, visited, te, c)
        te.pop()  # remove previously appended element

是的,可以理解。现在,如果我想要我的列表值回滚,那么我需要弹出元素。有其他选择吗?是的,可以理解。现在,如果我想要我的列表值回滚,那么我需要弹出元素。还有其他选择吗?这能回答你的问题吗?还要注意的是,代码分配给
c
(从而替换旧值),而它附加到
te
(从而修改相同的值)。不,我认为它没有说明如何在递归函数中执行。就像在列表回滚时保留它一样。是的,我收到了你的第二条评论。这是有道理的now@MisterMiyagi你的答案很准确!!我应该给出一个我可以标记为正确的答案:)这回答了你的问题吗?还要注意的是,代码分配给
c
(从而替换旧值),而它附加到
te
(从而修改相同的值)。不,我认为它没有说明如何在递归函数中执行。就像在列表回滚时保留它一样。是的,我收到了你的第二条评论。这是有道理的now@MisterMiyagi你的答案很准确!!我应该给出一个我可以标记为正确的答案:)也许改回并不是说它是指函数的返回的正确方式..c的旧值在返回后是如何使用的。但我知道这个c一直都是拷贝。但当我说te时,我指的是它的地址。在处理递归时,我不断地改变这个和那个,希望它能工作。有时的确如此。但现在我也想找到逻辑。你的例子确实给出了一个清晰的概念。感谢你的努力也许改回来不是说它是指函数的返回的正确方式..返回后c的旧值是如何使用的。但我知道这个c一直都是拷贝。但当我说te时,我指的是它的地址。在处理递归时,我不断地改变这个和那个,希望它能工作。有时的确如此。但现在我也想找到逻辑。你的例子确实给出了一个清晰的概念。谢谢你的努力