Python 在类中定义的全局变量
我找到了一个二叉树的Leetcode NO.543直径的解决方案,它是使用全局变量来解决的。我的解决方案如下文所示。作者使用标量变量self.res来存储最终答案,当程序遍历给定的二叉树时,最终答案会更新 我想知道为什么作者需要使用Python 在类中定义的全局变量,python,Python,我找到了一个二叉树的Leetcode NO.543直径的解决方案,它是使用全局变量来解决的。我的解决方案如下文所示。作者使用标量变量self.res来存储最终答案,当程序遍历给定的二叉树时,最终答案会更新 我想知道为什么作者需要使用self.res而不是一个通用的整数变量——例如,resonly——来存储答案;当我用res替换self.res时,答案是错误的。有人能指出区别吗 class Solution: def diameterOfBinaryTree(self, root: Tre
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有什么区别。这只是编程品味的问题吗?实例方法之外没有实例。也就是说,类解决方案
的存在,或者二叉树的直径
是一个方法而不是一个普通函数,都没有特别的原因。