为什么在类内部可以访问全局字典而不能访问全局整数变量?

时间:2019-09-22 16:43:42

标签: python class oop

我已经全局声明了一个字典,也声明了一个变量。现在,在一个类中访问这两个变量时,我可以访问字典,但是要访问另一个变量,我得到的是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 个答案:

答案 0 :(得分:2)

简短:

您正在尝试在一个函数中使用curr_length更改curr_length = len(str_)的值,该函数查找局部curr_length变量,但找不到该变量。它需要行global curr_length来知道它是一个global变量。

至于您为什么想知道为什么dict对象不需要global memoized行,您应该阅读以下答案: Global dictionaries don't need keyword global to modify them?Why is the global keyword not required in this case?

解释:

在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关键字