我有一个嵌套函数来实现如下算法:检查数组中循环的最长长度,输入数组中的值是跳转的下一个索引,得到循环的最大可能长度,否则只返回零。你知道吗
但是如果我使用result而不是result[],则会出现错误“UnboundLocalError:赋值前引用的局部变量'result'”,在函数dfs中找不到“result”参数,但可以找到visited和length。在我使用result而不是result之后,它就工作了。这是否意味着嵌套函数中只能使用默认列表?你知道吗
def max_length_loop(array):
def dfs(index, len):
if visited[index]:
result[0] = max(result[0], len-length[index])
return
visited[index] = True
length[index] = len
dfs(array[index], len + 1)
if not array:
return 0
n = len(array)
visited = [False for _ in xrange(n)]
length = [0 for _ in xrange(n)]
result = [0]
for i in xrange(n):
dfs(i, 0)
return result[0]
test = [1,2,3,4,0]
print max_length_loop(test)
在函数内部进行赋值时,解释器会假定左侧的名称是该函数中的本地引用,并将该名称定义为该特定函数的本地名称(这也适用于嵌套函数)。因此,当您试图在实际赋值之前访问变量
result
时,您将得到UnboundLocalError
。你知道吗最简单的例子说明了这个问题-
同样的事情也发生在你身上。当您将行更改为
result = <something>
时,实际上是在函数dfs()
内对result
变量进行赋值,这会导致解释器将其视为局部变量,因此,当您试图在定义result
之前访问它时,您就遇到了问题。你知道吗您不应该依赖于这样的嵌套作用域,并将所需的所有数据作为参数传递给函数。你知道吗
另外,我注意到的另一点是,您的逻辑有点错误,您应该在for循环中重新初始化
visited
数组和length
数组,否则它将返回它找到的第一个循环作为max length循环。你知道吗示例-
我认为问题出在这条线上:
你想要的是把这件事做好?你知道吗
但是,第一次通过时,取结果的最大值和其他一些值,但是结果以前没有用过,那么在max函数中会用什么值呢?你知道吗
如果需要,可以将这一行放在外部函数的顶部: 结果=0
这将创建一个名为result的全局变量。你知道吗
在dfs里面,把
所以你有这个(在Python3中):
Anand所说的在for循环中进行访问和长度数组初始化是正确的。你知道吗
相关问题 更多 >
编程相关推荐