如何在整个函数中更新指针



我有两个函数来查找图形(这是字典)中的循环:

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

最新更新