这两个python代码有什么区别?为什么结果不同?

时间:2018-12-26 04:48:46

标签: python

我正在编写如下的dfs代码:

def dfs(self, graph, node, path):
    if node==len(graph)-1:
        self.res.append(path)
    else:
        for i in graph[node]:
            path.append(i)
            self.dfs(graph, i, path)
            print(path.pop())

但是得到了意外的结果,而我将dfs中的for循环代码更改为:

self.dfs(graph, i, path+[i])

结果就是我想要的。但是我不知道这两个代码有什么区别。谢谢

2 个答案:

答案 0 :(得分:0)

从算法角度来说,我需要有关如何表示图形的更多信息,以提供更多见解。但是在代码方面,差异是由于Python中的List是 mutable 的事实引起的。 这意味着在您的原始代码中,当您pop path列表时,res中的条目将相应地更改。通过以下检查。

a = [1,2,3]
b = []

b.append(a)  # b = [[1,2,3]]
a.pop()      # now b = [[1,2]]

但是,当您将参数更改为path + [i]时,便会构造一个新的List,即,下一个path的递归调用中的dfs与上一个的去耦。通过以下检查。

a = [1,2]
b = []

b.append(a+[3])  # b = [[1,2,3]]
a.pop()          
# b is still [[1,2,3]], because the expression a + [3] will be evaluated to another List

答案 1 :(得分:0)

Te原始版本在每次递归的每次迭代中都会改变路径。第二个版本只是复制并添加了一个额外的元素。此副本未绑定到名称,只是传递到下一级递归。