python中对self的理解

本文探讨了在LeetCode题解中,何时需要在函数定义中使用self参数。根据作者的观点,如果函数是类的方法,那么需要self来访问类的属性。文中通过平衡二叉树和寻找二叉搜索树第k大节点的例子,展示了self的使用以及其对于代码运行时间和性能的影响。同时,注意到将函数定义在类内部可以提高运行效率。
摘要由CSDN通过智能技术生成

做leetcode的时候会看到题解里有些函数要self,有些不需要,因此查阅了一些资料。
看了这篇博文:https://blog.csdn.net/CLHugh/article/details/75000104
笔者认为,做题的时候如果这个函数是类的,那么就需要self,否则则不需要。
剑指 Offer 55 - II. 平衡二叉树为例:
在类内的:

class Solution:
    def recur(self,root):
            if not root:return 0
            left=self.recur(root.left)
            if left==-1:return -1
            right=self.recur(root.right)
            if right==-1:return -1
            return max(left,right)+1 if abs(left-right)<=1 else -1
    def isBalanced(self, root: TreeNode) -> bool:
        return self.recur(root)!=-1

不在类内的:

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def recur(root):
            if not root:return 0
            left=recur(root.left)
            if left==-1:return -1
            right=recur(root.right)
            if right==-1:return -1
            return max(left,right)+1 if abs(left-right)<=1 else -1
        return recur(root)!=-1

另外发现把函数写在类内的运行时间和跑分结果都比第二种好。

self可以使函数外部的变量在内部不被重定义

当函数内部引用了函数外部的变量,例如外部变量k=1,如果在函数内部k+=1,那么k就是函数内部被重定义了,成为了函数内部的局部变量,最后的结果不会传给外部的k,如果使用self.k+=1或者内部声明 nonlocal k,那么结果也会传给外部的k。如果是列表的中可变数据类型,部调用list.append() 等方法,不会改变引用,也就不需要做 self 和 nonlocal 等操作。
见题目剑指 Offer 54. 二叉搜索树的第k大节点

class Solution:
    def kthLargest(self, root: TreeNode, k: int) -> int:
        def dfs(root):
            if not root:return
            dfs(root.right)#因为是第k大,正常中序是左-中-右从小到大,这里要倒着
            if k==0:return#提前返回
            self.k-=1
            if self.k==0:
                self.res=root.val#注意这里的res
                return
            dfs(root.left)
        self.k=k
        dfs(root)
        return self.res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值