在 visited
或 f
的情况下,您可以改变变异变量 。在 current_ label
的情况下,您可以尝试将值重新分配给全球变量,而不声明它是全球性的 。
从外部范围变化的变数并不要求将其宣布为全球性的变数,但将值重新分配给一个全球性变数则要求将其宣布为全球性的变数 -- -- 否则,该变数被视为是局部性的(如果在分配前提供参考,则会发现此类差错)。
让我们看看代码:
1. def ts_r(n):
2. for nn in [v for v in g[n] if not visited[v]]:
3. visited[nn] = 1
4. ts_r(nn)
5. f[n] = current_label
6. current_label -= 1
在 5
的行中,您将全局变量值指定为 f[n]
,但后来在 6
的行中,您试图将这个全局变量指定为值。您没有告诉 Python 它是全球性的, 因此它假定它是本地的。 但如果是本地的, 您不能提前指定它 。
你有两个选择:
使用它作为本地:
def ts_r(n):
current_label = len(g) # initialize local variable
for nn in [v for v in g[n] if not visited[v]]:
visited[nn] = 1
ts_r(nn)
f[n] = current_label
current_label -= 1
告诉 Python 这是全局变量, 您想要更改全局变量 s 值 :
def ts_r(n):
global current_label # current_label is now global
for nn in [v for v in g[n] if not visited[v]]:
visited[nn] = 1
ts_r(nn)
f[n] = current_label
current_label -= 1
<强度 > EDIT 强度 > :
您的问题更新后, 我看到嵌套函数, 而不是全球范围定义的函数。 因此, < code > global 的解决方案不会起作用 。
在 Python 3.x 中,您有 nonlocal
关键词,但您需要找到 Python 2.x 情况下的行走方式。 另外,您至少有两种可能性:
使用包含不可变的变量的可变变量,其中包含您想要更改的不可变变量(例如,列表中含有一个整数 ) 。 当您仅提及列表的第一个元素( 并更改) 时, 请尝试它 。
另一种解决办法是为包装功能添加属性( 函数也是可变的, 您可以更改它, 但您不会污染全球命名空间 ) 。 例如 : < a href=" http:// ideone.com/7jGvM" rel=“ nofollow” > http://ideone. com/7jGvM 。 您的情况可能是这样 :
def topological_sort(g):
visited = zeros((len(g)), dtype= int32 )
f = zeros((len(g)), dtype= int32 )
topological_sort.current_label = len(g) # [] so it is seen inside ts_r
def ts_r(n):
for nn in [v for v in g[n] if not visited[v]]:
visited[nn] = 1
ts_r(nn)
f[n] = topological_sort.current_label
topological_sort.current_label -= 1
for i in range(len(g)):
if not visited[i]:
ts_r(i)
return f