在Python中传递给嵌套函数的参数

2024-04-25 03:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套函数来实现如下算法:检查数组中循环的最长长度,输入数组中的值是跳转的下一个索引,得到循环的最大可能长度,否则只返回零。你知道吗

但是如果我使用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)                      

Tags: 函数inforindexlenreturndef数组
2条回答

在函数内部进行赋值时,解释器会假定左侧的名称是该函数中的本地引用,并将该名称定义为该特定函数的本地名称(这也适用于嵌套函数)。因此,当您试图在实际赋值之前访问变量result时,您将得到UnboundLocalError。你知道吗

最简单的例子说明了这个问题-

>>> c = 10
>>> def a():
...     c = c + 10
...
>>> a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in a
UnboundLocalError: local variable 'c' referenced before assignment

同样的事情也发生在你身上。当您将行更改为result = <something>时,实际上是在函数dfs()内对result变量进行赋值,这会导致解释器将其视为局部变量,因此,当您试图在定义result之前访问它时,您就遇到了问题。你知道吗

您不应该依赖于这样的嵌套作用域,并将所需的所有数据作为参数传递给函数。你知道吗

另外,我注意到的另一点是,您的逻辑有点错误,您应该在for循环中重新初始化visited数组和length数组,否则它将返回它找到的第一个循环作为max length循环。你知道吗

示例-

def max_length_loop(array):
    def dfs(index, len, result, visited, length):
        if visited[index]:
            result = max(result, len-length[index])
            return result
        visited[index] = True
        length[index] = len
        return dfs(array[index], len + 1, result, visited, length)
    if not array:
        return 0
    n = len(array)
    result = 0
    for i in range(n):
        visited = [False for _ in range(n)]
        length = [0 for _ in range(n)]
        result = max(dfs(i, 0, 0, visited, length), result)
    return result

test = [1,2,3,4,0]
max_length_loop(test)
>>> 5
test = [1,2,1,4,5,6,7,3]
max_length_loop(test)
>>> 5

我认为问题出在这条线上:

result[0] = max(result[0], len-length[index])

你想要的是把这件事做好?你知道吗

result = max(result, len-length[index])

但是,第一次通过时,取结果的最大值和其他一些值,但是结果以前没有用过,那么在max函数中会用什么值呢?你知道吗

如果需要,可以将这一行放在外部函数的顶部: 结果=0

这将创建一个名为result的全局变量。你知道吗

在dfs里面,把

global result

所以你有这个(在Python3中):

result = 0

def max_length_loop(array):

    def dfs(index, len):
        global result
        if visited[index]:
            result = max(result, len-length[index])
            return result
        visited[index] = True
        length[index] = len
        dfs(array[index], len + 1)

    if not array:
        return 0
    n = len(array)
    visited = [False for _ in range(n)]
    length = [0 for _ in range(n)]

    for i in range(n):
        visited = [False for _ in range(n)]
        length = [0 for _ in range(n)]
        dfs(i, 0)

    return result


test = [1,2,3,4,0]
print(max_length_loop(test))

Anand所说的在for循环中进行访问和长度数组初始化是正确的。你知道吗

相关问题 更多 >