python中的全局变量(以拓扑排序代码为例)

时间:2015-02-27 12:36:29

标签: python

这是我使用DFS算法的“图的拓扑顺序”代码:

#dfs
def topological_sort(Graph):
    for v in Graph:
        if v not in visited:
            dfs(Graph,v)
    print(topo_order)

def dfs(Graph,start):
    global n
    visited.add(start)
    for w in Graph[start]:
        if w not in visited:
            dfs(Graph,w)
    topo_order[start]=n
    n-=1

visited=set()
n=0
topo_order={}

if __name__=='__main__':
    with open('topological_test.txt') as f:
        data=f.read()
    data=data.split('\n')
    data=[i.split() for i in data]        
    G={}
    for lst in data:
        G[lst[0]]=lst[1:]
    n=len(G)
    topological_sort(G)

我使用了3个全局变量visitedntop_order

上面的代码在topological_test.txt

的情况下正确运行
s v w
v t
w t
t

如果我在功能global n中删除dfs,则会出现错误:

 UnboundLocalError: local variable 'n' referenced before assignment

注意到我没有在函数global visited中编写topological_sort,运行此程序时没有错误提示?

为什么我们需要global n而不是global visited

2 个答案:

答案 0 :(得分:2)

如果使用新值覆盖全局变量,则需要使用global语句。但是通过visited.add,您只需更改已存在的全局变量中的内容。

如果您想在全球范围内完全更改设置,则需要global, 即。

def dfs(Graph,start):
    global n
    global visited
    visited = set() # creates a new empty set on global level

答案 1 :(得分:0)

n-=1

这被解释为n = n - 1。 这意味着它希望将新名称绑定到值。这会影响全局n变量,并且由于它在最初绑定之前尝试将自身分配给自身,因此它会引发您所看到的错误。

visited函数中没有对dfs变量的赋值,因此visited明确指出全局范围。