二分木の高さを求める以下のコードで、#####の箇所について疑問があります。
self.max_depth=0
の部分ですが、selfがあることで、
" local variable 'max_depth' referenced before assignment "
のエラーが出なくなります。なぜ、selfをつけるとこのエラーを回避できるのでしょうか。
イニシャライズと同じようなことをやっているようにも思いますが、
def ____init____で定義されているわけではないので、単なる変数の宣言と
同じと考えました。しかし、そうであるなら、なぜ上記のエラーが出ないのかわかりません。
Python
1 2def maxDepth(self, root: Optional[TreeNode]) -> int: 3 self.max_depth=0 ##### 4 def helper(node: TreeNode, depth: int): 5 if not node: 6 return 0 7 8 if not node.left and not node.right: 9 self.max_depth = max(self.max_depth, depth) ### 10 else: 11 helper(node.left, depth + 1) 12 helper(node.right, depth + 1) 13 14 helper(root, 1) 15 return self.max_depth
言葉足らずでした。ehshellさんがおっしゃる通り、全てのselfを外すという解釈で正しいです。
その時の" local variable 'max_depth' referenced before assignment "エラーは、
当然ですが###の部分で出ます。
selfを外すと、max_depthローカル変数として扱われるということはわかりました。
ただ、self.max_depth=0 は、maxDepth関数内で宣言されています。
グローバル変数は、関数外でイニシャライズするものとばかり思っていたのですが、
上記のような形で、グローバル変数をイニシャライズすることも多いのでしょうか。
例えば今回の場合では、`
Python
1def __init__(self): 2 self.max_depth = 0 3 4def maxDepth(self, root: Optional[TreeNode]) -> int: 5 #以下、略
のようにするのが作法と思っていましたが、そうでもないのでしょうか。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/07 00:10