[英]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)
我認為這清楚地表明面向對象的東西並不重要,它更多的是成為一個全局變量。 但是,在您的示例中, recursion
在sortedListToBST
內部,因此我認為它實際上可能已經訪問了head
。 所以我認為使用self
是不必要的,作者沒有意識到這一點。 在函數式編程術語self.head
允許recursion
產生副作用。
您還可以通過在recursion
的 arguments 中傳遞head
來消除對這個全局變量的需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.