我有两个函数来查找图形(这是字典)中的循环:
def cycle_exists(G):
color = { u : "white" for u in G}
found_cycle = [False]
for u in G:
if color[u] == "white":
dfs_visit(G, u, color, found_cycle)
if found_cycle[0]:
break
if not found_cycle[0]:
return None
return found_cycle[1]
def dfs_visit(G, u, color, found_cycle):
if found_cycle[0]:
return
color[u] = "gray"
for v in G[u]:
if color[v] == "gray":
found_cycle = [True, v]
return
if color [v] == "white":
dfs_visit(G, v, color, found_cycle)
color[u] = "black"
当在dfs_visit
中找到一个循环时,found_cycle
被赋[True, v]
,但是当Python返回到cycle_exists
函数时,found_cycle
仍然是False
。为什么不更新?
您正在为found_cycle
分配一个新列表,这意味着调用函数中不会反映任何更改。因此,假设您打算更新原始列表,您可以:
found_cycle[0] = True
found_cycle[1] = v
或者更简单地说,使用切片分配:
found_cycle[:] = [True, v]
或者只是从 dfs_visit()
返回值。
这两个found_cycle
是每个函数的本地,不能共享。您应该返回其值并重新分配它:
def cycle_exists(G):
...
found_cycle = dfs_visit(G, u, color, found_cycle)
和
def dfs_visit(G, u, color, found_cycle):
...
return found_cycle
...
return found_cycle