Почему глобальный словарь доступен внутри класса, а глобальная целочисленная переменная - нет? - PullRequest
0 голосов
/ 22 сентября 2019

Я объявил словарь глобально, а также переменную.Теперь при доступе к обоим в классе я могу получить доступ к словарю, но для доступа к другой переменной я получаю UnboundLocalError.Для решения этой проблемы я использовал строку кода: global curr_length, а затем получил доступ к нему, и он запустился.Но я хотел знать, почему эта дополнительная строка кода требуется для обычной целочисленной переменной, а для словаря - нет?

Код:

memoized = {}
curr_length = 0
curr_pal = ""


class Solution:
    def check_palindrome(self, str_):
        if len(str_) <= 1:
            return False
        global curr_length
        if len(str_) <= curr_length:
            return False
        if memoized.get(str_, None):
            return memoized[str_]
        if str_ == str_[::-1]:
            memoized[str_] = True
            curr_length = len(str_)
            return True
        memoized[str_] = False
        return False

    def longest_palindrome(self, str_, starting_index):
        if len(str_) <= 1:
            return None
        n = len(str_)
        if self.check_palindrome(str_[starting_index:n]):
            return str_
        n -= 1
        self.longest_palindrome(str_[starting_index:n], starting_index)

    def longestPalindrome(self, s: str) -> str:
        for starting_index in range(len(s)):
            pal = self.longest_palindrome(s, starting_index)
            if pal:
                return pal
        return ""


solution = Solution()
print(solution.longestPalindrome("babad"))

1 Ответ

2 голосов
/ 22 сентября 2019

Short:

Вы пытаетесь изменить значение curr_length с помощью curr_length = len(str_) внутри функции, которая ищет локальную переменную curr_length и не может ее найти.Чтобы узнать, что это переменная global, нужна строка global curr_length.

Если вам интересно, почему объекту dict не нужна строка global memoized, вы должны прочитать ответ на: Глобальным словарям не нужно ключевое слово global для измененияих? или Почему глобальное ключевое слово не требуется в этом случае?

ОБЪЯСНЕНИЕ:

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

Давайте рассмотрим пример создания глобальной переменной в Python.

x = "global"

def foo():
    print("x inside :", x)

foo()
print("x outside:", x)

Когда мы запускаем код,будет:

x inside : global
x outside: global

В приведенном выше коде мы создали x как глобальную переменную и определили foo () для печати глобальной переменной x.Наконец, мы вызываем функцию foo (), которая выведет значение x.

Что если вы хотите изменить значение x внутри функции?

def foo():
    x = x * 2
    print(x)
foo()

Когда мы запустим код,будет вывод:

UnboundLocalError: local variable 'x' referenced before assignment

Вывод показывает ошибку, потому что Python обрабатывает x как локальную переменную и x также не определен внутри foo ().

Чтобы сделать это, мы используем global ключевое слово

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...