首页 > 解决方案 > 这两个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])

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

标签: python

解决方案


算法方面,我需要更多关于如何表示图表的信息,以便提供更多洞察力。但是在代码方面,差异是由 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

推荐阅读