繁体   English   中英

为什么这个递归函数调用需要“self”

[英]Why does this recursive function call require 'self'

这是我对反向链表问题的解决方案。 我不明白为什么当我在函数中调用reverseList(head.next) ,除非我包含self否则会出现错误

 #Recursive Solution
 def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        
        p = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return p
    

没有自我的错误 -

NameError: name 'reverseList' is not defined
    p = reverseList(head.next)
Line 22 in reverseList (Solution.py)
    ret = Solution().reverseList(param_1)
Line 45 in _driver (Solution.py)
    _driver()
Line 56 in <module> (Solution.py)

有什么建议?

函数reverseList(self, head: ListNode) -> ListNode实际上是一个方法(它属于一个类)。 self表示方法访问对象,其中包含对象的状态。 但是,这里的情况并非如此。

因为它是一个类的方法,第一个参数是指那个类的实例。

完全不清楚为什么它是一个方法,因为它反转了一个与自身不同的列表,并且除了该方法之外不使用它自己的任何属性。

这应该也能正常工作:

def reverseList(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head
    
    p = reverseList(head.next)
    head.next.next = head
    head.next = None
    return p

您可以使用@staticmethod 装饰器,它告诉解释器此方法不需要对象的访问权限。 您也可以在不构造对象的情况下使用它。 实际上,静态方法只是在类中定义的普通函数,主要是为了更好地组织代码 - 对于您的目的,普通函数而不是方法就足够了。

@staticmethod
def reverseList(head: ListNode) -> ListNode:

当你在函数内部使用 self 时,你只需要用你的类对象替换它。

        p = Solution.reverseList(head.next)

编辑:实际上在这里,因此您使用的是类实例,而不是特定对象,甚至更好的是类方法。

@classmethod
def reverseList(cls, head: ListNode) -> ListNode:
...
p = cls.reverseList(head.next)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM