簡體   English   中英

Python leetcode 問題中“self”的使用

[英]Usage of "self" in Python leetcode problem

我正在研究 109. 在 leetcode 上將排序列表轉換為二叉搜索樹,我遇到了一個我最了解的解決方案,除了使用 self.

解決方案:

class Solution:
    def sortedListToBST(self, head):
        length = 0
        curr = head
        while curr:
            curr = curr.next
            length += 1

        self.head = head

        def recursion(start, end):
            if start > end: return None
            middle = (start + end) // 2
            # left
            left = recursion(start, middle - 1)

            # root
            root = TreeNode(self.head.val)
            self.head = self.head.next
            root.left = left

            # right
            root.right = recursion(middle + 1, end)
            return root

        return recursion(0, length - 1)

我對self.head = head的使用感到困惑。 我了解self用於指示或指定 class 的當前實例,並用於訪問所述 class 的變量。 我目前對其工作原理的理解是self.head被定義為指向 object head的全局變量(在recursion(start,end)的 scope 之外)。 我不明白為什么需要使用 self ,以及為什么我們不能只說copyOfHead = head而不是self.copyOfHead = head 我確定我在這里弄錯了 - 有人可以幫助更好地理解使用self. 在這種情況下?

它只是提供一個全局變量,以便recursion (將被多次調用)可以使用它在調用之間存儲 state。

Leetcode 被設計成你必須使用 class 包裝器,但是對於這個算法,你可以很容易地編寫:

self_head = None

def sortedListToBST(head):
    length = 0
    curr = head
    while curr:
        curr = curr.next
        length += 1

    self_head = head

    return recursion(0, length - 1)

def recursion(start, end):
    if start > end: return None
    middle = (start + end) // 2
    # left
    left = recursion(start, middle - 1)

    # root
    root = TreeNode(self_head.val)
    self_head = self_head.next
    root.left = left

    # right
    root.right = recursion(middle + 1, end)
    return root

# Run the function
sortedListToBST(some_input)

我認為這清楚地表明面向對象的東西並不重要,它更多的是成為一個全局變量。 但是,在您的示例中, recursionsortedListToBST內部,因此我認為它實際上可能已經訪問了head 所以我認為使用self是不必要的,作者沒有意識到這一點。 在函數式編程術語self.head允許recursion產生副作用。

您還可以通過在recursion的 arguments 中傳遞head來消除對這個全局變量的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM