簡體   English   中英

無法在 Python 中獲取 DFS 的全局變量以返回正確的值

[英]Can't get global variable of DFS in Python to return the right value

我正在學習使用 Python 來實現 DFS 算法。 DFS 將返回二叉樹中的最大值

我寫了兩種方法。 第一種方法是 findMax 函數 - 它使用返回值來跟蹤樹中的最大值。 第二種方法是 findMax2 函數 - 它使用全局變量來跟蹤最大值。

我四處搜索,但無法真正理解為什么我的第二種方法不起作用 - 全局變量 max_val 不會返回正確的值,並且錯誤消息是

UnboundLocalError: local variable 'max_val' referenced before
assignment

我不太擅長 Python,因此非常感謝任何幫助。 :) 這是代碼。

class Node:
  def __init__(self, key):
    self.left = None
    self.val = key
    self.right = None

  def inorder(self, root):
    if root:
      self.inorder(root.left)
      print(root.val)
      self.inorder(root.right)

  def findMax(self, root):
    if root is None:
      return float('-inf')  
    max_lv = self.findMax(root.left)       
    max_rv = self.findMax(root.right)
    return max(root.val, max_lv, max_rv)    

  max_val = float('-inf')
  def findMax_2(self, root):
    if root is None:
      return max_val
    max_val = max(max_val, root.val)    
    dfs(root.left)                      
    dfs(root.right)

r = Node(5)
r.left = Node(1)
r.left.left = Node(8)
r.left.right = Node(11)
r.inorder(r)
print(r.findMax_2(r))

更新:感謝大家的評論。 我根據 ggorlen 的建議修改了我的代碼。

def findMax_2(self, root):
    def dfs(node):
      if node is None:
        return max_val
      max_val = max(max_val, node.val)
      print("max_val:", max_val)
      dfs(node.left)
      dfs(node.right)

    max_val = float('-inf')
    dfs(root)
    return max_val

但我仍然遇到同樣的錯誤:

Traceback (most recent call last):
  File "dfs_findMax_2.py", line 56, in <module>
    print("max val:", r.findMax_2(r))
  File "dfs_findMax_2.py", line 44, in findMax_2
    dfs(root)
  File "dfs_findMax_2.py", line 38, in dfs
    max_val = max(max_val, node.val)
UnboundLocalError: local variable 'max_val' referenced before assignment

我錯過了什么嗎?

Python 范圍規則有一些尖角。

在類內和函數外, max_val是類變量。 在函數內部,它是一個作用於函數的詞法變量,它恰好具有相同的名稱。 您的錯誤是因為您在分配詞法變量之前正在訪問它,所以 Python 知道您感到困惑(但沒有提供足夠的上下文來讓您感到困惑)。

要訪問函數內的類變量,您需要訪問self.max_val

如果它確實是一個全局變量,那么在對它進行任何操作之前,您需要在函數中聲明一個global max_val (不是,所以不要嘗試。)如果一個函數包含在另一個函數中,您需要改為執行nonlocal max_val

最后,因為它是一個類變量,所以可以通過該類的所有實例訪問它。 如果你希望它成為一個實例變量,你會在你的init方法中分配給self.max_val ,你仍然可以在其他方法中通過self.max_val訪問它。

根據 ggorlen 的建議,這里是有效的代碼。 謝謝!

def findMax_2(self, root):
    def dfs(node):
        nonlocal max_val
        if node is None:
            return
        max_val = max(max_val, node.val)
        dfs(node.left)
        dfs(node.right)

    max_val = float('-inf')
    dfs(root)
    return max_val

暫無
暫無

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

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