Py学习  »  Python

UnboundLocalError:在为一个变量赋值之前引用局部变量“x”,而其他变量在Python中工作

Joey Joestar • 3 年前 • 1031 次点击  

为什么在的赋值错误之前引用了局部变量 cur_max 而我可以用 copy_matrix dfs 作用

class Solution:
    def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
        rows, columns = len(matrix), len(matrix[0])
        copy_matrix = {}
        cur_max = 0
        
        def dfs(r, c, prev):
            if (r < 0 or c < 0 or
                r == rows or c == columns or
                matrix[r][c] <= prev):
                return 0
            
            if (r, c) in copy_matrix:
                return copy_matrix[(r, c)]
            
            max_length = 0
            max_length = max(max_length, 1 + dfs(r + 1, c, matrix[r][c]))
            max_length = max(max_length, 1 + dfs(r - 1, c, matrix[r][c]))
            max_length = max(max_length, 1 + dfs(r, c + 1, matrix[r][c]))
            max_length = max(max_length, 1 + dfs(r, c - 1, matrix[r][c]))
            copy_matrix[(r, c)] = max_length
            cur_max = max(cur_max, copy_matrix[(r, c)])
            
            return max_length
        
        for r in range(rows):
            for c in range(columns):
                dfs(r, c, -1)
        
        return max(copy_matrix.values())

这是我得到的

UnboundLocalError: local variable 'cur_max' referenced before assignment
    cur_max = max(cur_max, copy_matrix[(r, c)])
Line 22 in dfs (Solution.py)
    dfs(r, c, -1)
Line 28 in longestIncreasingPath (Solution.py)
    ret = Solution().longestIncreasingPath(param_1)
Line 49 in _driver (Solution.py)
    _driver()
Line 60 in <module> (Solution.py)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132124
 
1031 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Ibrahim
Reply   •   1 楼
Ibrahim    3 年前

这是因为 copy_matrix 这里没有局部变量,所以它引用 nonlocal 第6行出现变量ie copy_matrix = {} ,而 cur_max 它被定义为第24行的局部变量 cur_max = max(cur_max, copy_matrix[(r, c)]) ,它引用的是非局部变量 copy_matirx , rows , columns 但它引用的是局部变量 cur_max 因为它是在函数中定义的,并且在赋值之前被引用。你可能想做的是

def dfs(r, c, prev):
    nonlocal cur_max
    if (r < 0 or c < 0 or
        r == rows or c == columns or
        matrix[r][c] <= prev):
        return 0
    
    if (r, c) in copy_matrix:
        return copy_matrix[(r, c)]
    
    max_length = 0
    max_length = max(max_length, 1 + dfs(r + 1, c, matrix[r][c]))
    max_length = max(max_length, 1 + dfs(r - 1, c, matrix[r][c]))
    max_length = max(max_length, 1 + dfs(r, c + 1, matrix[r][c]))
    max_length = max(max_length, 1 + dfs(r, c - 1, matrix[r][c]))
    copy_matrix[(r, c)] = max_length
    cur_max = max(cur_max, copy_matrix[(r, c)])
    
    return max_length

read more