Python 在类中定义的全局变量

Python 在类中定义的全局变量,python,Python,我找到了一个二叉树的Leetcode NO.543直径的解决方案,它是使用全局变量来解决的。我的解决方案如下文所示。作者使用标量变量self.res来存储最终答案,当程序遍历给定的二叉树时,最终答案会更新 我想知道为什么作者需要使用self.res而不是一个通用的整数变量——例如,resonly——来存储答案;当我用res替换self.res时,答案是错误的。有人能指出区别吗 class Solution: def diameterOfBinaryTree(self, root: Tre

我找到了一个二叉树的Leetcode NO.543直径的解决方案,它是使用全局变量来解决的。我的解决方案如下文所示。作者使用标量变量self.res来存储最终答案,当程序遍历给定的二叉树时,最终答案会更新

我想知道为什么作者需要使用
self.res
而不是一个通用的整数变量——例如,
res
only——来存储答案;当我用res替换self.res时,答案是错误的。有人能指出区别吗

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        self.res = 0 
        def depth(root):
            if not root:
                return 0
            left = depth(root.left)
            right = depth(root.right)
            self.res = max(self.res, left + right) 
            return max(left, right) + 1
        depth(root)    
        return self.res

严格地说,它不一定是一个属性。它可能是一个非局部变量

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        res = 0
        def depth(root):
            nonlocal res
            if not root:
                return 0
            left = depth(root.left)
            right = depth(root.right)
            res = max(res, left + right) # the key to memorize the result
            return max(left, right) + 1
        depth(root)    
        return res
类解决方案:
def二叉树直径(自身,根:树状)->int:
res=0
def深度(根):
非局部res
如果不是根目录:
返回0
左=深度(根。左)
右=深度(根。右)
res=max(res,左+右)#记忆结果的键
返回最大值(左、右)+1
深度(根)
返回res
如果没有
nonlocal
语句,
res
将是一个局部变量,在
depth
第一次尝试在调用
max
时不会设置它


Python2没有
非局部
语句,因此对于在调用
深度
之间持久化状态而言,实例属性是全局变量的最佳选择。(类型提示表明这可能不是为Python2编写的,但旧习惯可能很难改掉。)在Python3中,使用
非本地
,上面甚至不再使用
self
,因此,
diameterOfBiarytree
可以作为常规函数编写,而不是作为不必要类的实例方法编写。

这是一个可变范围的问题。如果在
def depth
之后立即声明
global res
,则其工作原理应与原始解决方案相同
res
不必是全局的<代码>深度可以访问在同一范围内定义的局部变量。@Demi Lune我明白了。然后,我想知道在
类解决方案:
之后声明self.res作为对象的属性与在特定方法
diameterOfBinaryTree
中声明self.res有什么区别。这只是编程品味的问题吗?实例方法之外没有实例。也就是说,类
解决方案
的存在,或者
二叉树的直径
是一个方法而不是一个普通函数,都没有特别的原因。