переменная не определена даже после установки как глобальная (Python) Как мне подойти к таким случаям?

#python #recursion #nameerror

#python #рекурсия #ошибка имени

Вопрос:

У меня есть рекурсивная функция, которая вычисляет некоторый ответ в конце, и я должен сохранить максимум этих временных ответов и вернуть его.

Код выглядит следующим образом.
(Если вы это знаете, я не беспокоюсь об алгоритме Кадане, я хотел знать, как это сделать)

 class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        
        ans = nums[0]
        
        def helper(n):
            
            global ans

            if(n == 1):
                return nums[0]
            
            temp = max(nums[n-1], nums[n-1] helper(n-1))
            
            ans = max(ans, temp) ### how do I do this? ###
            
            return temp
        
        helper(len(nums))
        return ans
 

Ошибка, которую я получаю,:
NameError: name 'ans' is not defined

Как мне сохранить максимальное значение и вернуть его в таких случаях? Поскольку это не работает.

Комментарии:

1. Потому ans что при первой попытке ее использования глобального значения нет

Ответ №1:

Это идеальный вариант использования для nonlocal ключевого слова! Это ключевое слово позволяет ссылаться на ans переменную во включающей функции.

Решение (просто заменить global на nonlocal ):

 class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        
        ans = nums[0]
        
        def helper(n):
            
            nonlocal ans

            if(n == 1):
                return nums[0]
            
            temp = max(nums[n-1], nums[n-1] helper(n-1))
            
            ans = max(ans, temp) ### how do I do this? ###
            
            return temp
        
        helper(len(nums))
        return ans
 

Комментарии:

1. «Это ключевое слово позволяет ссылаться на переменную ans во включающей функции». Это позволяет вам присваивать ей, вы всегда можете просто ссылаться на нее. Но да, это намного лучше, чем использование глобальной переменной

Ответ №2:

вы должны добавить global ans дважды в первой функции и во второй. с вашим кодом:

 class Solution:
def maxSubArray(self, nums: List[int]) -> int:

    global ans

    ans = nums[0]
    
    def helper(n):
        
        global ans

        if(n == 1):
            return nums[0]
        
        temp = max(nums[n-1], nums[n-1] helper(n-1))
        
        ans = max(ans, temp) ### how do I do this? ###
        
        return temp
    
    helper(len(nums))
    return ans
 

Ответ №3:

Вам нужно объявить глобальную в той же функции, что и само объявление переменной, потому что прямо сейчас вы пытаетесь установить глобальную для переменной, которая находится за пределами области видимости вложенной функции.

Следующий код должен работать:

 class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        
    global ans
    ans = nums[0]
    
    def helper(n):
        
        global ans
        if(n == 1):
            return nums[0]
        
        temp = max(nums[n-1], nums[n-1] helper(n-1))
        
        ans = max(ans, temp) ### how do I do this? ###
        
        return temp
    
    helper(len(nums))
    return and
 

имейте в виду, что вы должны указывать global ans не только при определении переменной, но и в каждой функции, которую вы хотите присвоить переменной.