什么时候需要在嵌套函数中使用self?

时间:2020-07-07 22:28:41

标签: python nested self

为什么下面的代码(通过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

2 个答案:

答案 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

参考文献