蛮力下面的代码创建城市图形,然后通过DFS运行它以找到最短路径。无论我使用'visited.append(node)'还是'visited = visited + [node]',我得到的结果都是不同的。追加到列表不正确找不到最短的路径。
DFS中的打印用于调试为什么存在差异,但是我无法确定差异是什么。谁能向我解释这个细节?谢谢!
def CreateGraph(cities):
g={}
for city in cities:
g[city]=[]
return g
def AddRouteToGraph(g,src,dest):
if src in g and dest in g:
g[src].append(dest)
else:
raise ValueError
cities=['Bmore', 'DC', 'SanFran', 'Philly', 'Seattle', 'NYC']
g=CreateGraph(cities)
AddRouteToGraph(g,'Bmore','Seattle')
AddRouteToGraph(g,'Bmore','Philly')
AddRouteToGraph(g,'Philly','NYC')
AddRouteToGraph(g,'DC','NYC')
AddRouteToGraph(g,'SanFran','Philly')
AddRouteToGraph(g,'SanFran','DC')
AddRouteToGraph(g,'SanFran','Seattle')
AddRouteToGraph(g,'Seattle','DC')
def DFS_shortest(g,node,dest,visited,shortest):
visited.append(node)
#visited=visited + [node]
print(f'visited={visited} of type {type(visited)}')
if node==dest:
return visited
for city in g[node]:
if city not in visited:
if shortest!=None:
print(city, str(len(visited)), str(len(shortest)))
else:
print(city, str(len(visited)), 'None')
if shortest==None or len(visited)<len(shortest):
newPath=DFS_shortest(g,city,dest,visited,shortest)
if newPath!=None:
shortest=newPath
return shortest
print(DFS_shortest(g,'Bmore','NYC',[],None))
答案 0 :(得分:3)
通过执行visited = visited + ...
,您将创建一个列表的新实例,该实例独立于上一个递归级别的实例。
当您使用visited.append(...)
时,您正在修改同一对象实例,因此,当您将其传递给递归时,较低级别的更改实际上会更改较高级别的列表
答案 1 :(得分:1)
这是因为当您将visited
列表传递给其他方法时,会传递一个引用,因此在这些方法中进行的任何更改(例如追加)都会影响原始的visited
列表。
但是,当您使用visited = visited + [node]
时,会创建一个新列表,并将其传递给其他方法。
例如考虑
def func(l):
# l.append(1)
l = l + [1]
if len(l) < 10:
func(l)
l = []
func(l)
print(l)
尝试一下,一看就会明白。
l.append(1)
输出
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
原始列表l
已更改。
l = l + [1]
输出
[]
原始列表l
未已更改。