[英]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.