python - 这两个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 中的 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
推荐阅读
- firebase - 使用 Firebase 的 Swiftui 中未显示数据
- python - Pygame 上的多个进程无法识别键盘输入
- javascript - 如何在 Reactjs 中上传 Dropzone 之前调整图像大小?
- amazon-web-services - ALB 如何在滚动更新部署期间将请求分发到 Fargate 服务?
- spring-security - 登录重定向转到 STOMP 端点
- amazon-web-services - AWS Application Load Balancer 将所有 www 和非 http 重定向到 https://
- c++ - MFC:如何设置 CEdit 框的焦点?
- sql - Oracle:加载日期时间
- html - 如何去除 Django 生成的 html 周围的引号?
- .net - 在运行 cake 脚本时配置环境变量以解决版本不匹配问题