Python 未定义的变量问题

Python undefined variable issue

在 python 编程期间,我遇到了一个未定义的错误。

错误是关于'flag'变量的,我可以在上面的打印语句中使用它而没有任何错误。

为什么只有数组索引会出错?

如果你有什么想法,请分享给我。

感谢您的关注。

class Solution:
    def rob(self, nums: List[int]) -> int:
        global memo
        
        memo = [[0 for j in range(len(nums))] for i in range(2)]
        flag = 0
        #print("===========================")
        def dp(i : int) -> int:
            global flag
            
            if i >= len(nums):
                #print(i,"return 0")
                return 0

            if i == 1:
                flag = 1
                #print(str(i) + " : " + str(globals), memo)

            if memo[flag][i] is not 0: # <= undefined error occur because of flag
                #print(i,"*",memo)
                return memo[i]
            memo[i] = max(dp(i+1), (dp(i+2) + nums[i]))
            if i is len(nums) - 1 and i is not 0:
                result = nums[i] * flag
                flag = 0
                #print(str(i) + " ! " , result)
                return result
            #print(i,"-",memo)
            return memo[i]
        return max(dp(0), dp(1))
NameError: name 'flag' is not defined. Did you mean: 'flags'?
    if memo[flag][i] is not 0:
Line 21 in dp (Solution.py)
    return max(dp(0), dp(1))
Line 37 in rob (Solution.py)
    ret = Solution().rob(param_1)
Line 57 in _driver (Solution.py)
    _driver()
Line 68 in <module> (Solution.py)
  if i is len(nums) - 1 and i is not 0:
  if memo[flag][i] is not 0:

好吧,问题的发生是因为您在另一个函数中有一个函数,所以 global 关键字将不起作用。 Python有四个作用域:Local、Enclose、Global,Built-in和rob函数在Enclose作用域中,所以你要做的就是更改nonlocal关键字如下:

def dp(i : int) -> int:
    nonlocal flag

    if i >= len(nums):
       #print(i,"return 0")
       return 0

顺便说一句,不推荐使用 localnonlocal,因此请尝试以其他方式使用。