为什么下面的代码(通过LeetCode)中的self
需要使用ans
而不是min1
?
def findSecondMinimumValue(self, root):
self.ans = float('inf')
min1 = root.val
def dfs(node):
if node:
if min1 < node.val < self.ans:
self.ans = node.val
elif node.val == min1:
dfs(node.left)
dfs(node.right)
dfs(root)
return self.ans if self.ans < float('inf') else -1
答案 0 :(得分:1)
min1
在函数主体中是局部的。其名称仅存在于findSecondMinimumValue()
的正文中。代码退出该功能后,min1将无法使用。
ans
是属于类实例的属性,必须通过self
进行访问。如果您为该方法所属的类创建了两个不同的实例,则意味着每个实例都有自己的self.ans
版本,self
是引用调用该方法的实例的名称。 self.ans
因此是指实例的ans
属性。
例如:
class Example:
foo = "CLASS attribute"
def __init__(self):
self.bar = "INSTANCE attribute"
a = Example()
b = Example()
a.bar = "INSTANCE attribute changed"
print(a.bar) # -> "INSTANCE attribute changed"
print(b.bar) # -> "INSTANCE attribute" because changing a.bar doesn't affect b.bar
Example.foo = "CLASS attribute changed"
print(a.foo == b.foo) # -> True
答案 1 :(得分:0)
我想这要简单得多。您正在递归更改self.ans
。这就是为什么,如果您不使用self
,那么我想必须定义并传递一个额外的变量。
还有另一个版本,可以通过:
class Solution:
def findSecondMinimumValue(self, root):
self.second = float('inf')
def traverse(node):
if not node:
return
if root.val < node.val < self.second:
self.second = node.val
traverse(node.left)
traverse(node.right)
traverse(root)
return -1 if self.second == float('inf') else self.second