这是我使用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个全局变量visited
,n
,top_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
?
答案 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
明确指出全局范围。