LeetCode二叉树直径问题:全局int变量访问报错,list却正常?
为什么int变量报错而List可以正常运行
这是Python变量作用域规则导致的差异:
对于第一段代码里的
int类型变量dia:
在嵌套的dfs函数中,当你执行dia = max(dia, 2+left+right)时,Python会将dia标记为当前函数的局部变量。但在这之前的print(dia)语句已经尝试引用这个局部变量,而此时它还没有被赋值,所以就抛出了UnboundLocalError——本质是局部变量在赋值前被引用了。对于第二段代码里的
list类型变量dia:
你执行的是dia[0] = max(dia[0], 2+left+right),这并不是给dia本身赋值,而是修改列表对象的元素。Python会向上查找外层作用域的dia变量(也就是那个列表对象),不会将dia标记为dfs的局部变量,因此可以正常访问和修改列表里的元素,不会触发作用域错误。
修复第一段代码的两种方法
- 使用
nonlocal关键字声明,明确告诉Pythondia是外层函数的变量:
class Solution(object): def diameterOfBinaryTree(self, root): dia=0 def dfs(root): nonlocal dia # 声明dia来自外层作用域 if not root: return -1 left=dfs(root.left) right=dfs(root.right) dia=max(dia,2+left+right) return 1+ max(left, right) dfs(root) return dia
- 继续使用可变对象(比如list、字典),通过修改对象内部值绕过赋值带来的作用域问题,也就是你第二段代码的写法。
内容的提问来源于stack exchange,提问作者Arjun p
相关产品推荐
相关产品推荐

