Python类中嵌套函数为何可访问外层列表却无法访问普通变量?
为什么将res改为普通变量后,嵌套dfs函数无法正常访问修改?
这本质是Python的变量作用域规则和可变对象特性共同导致的:
当你把
res = [0]改成普通变量res = 0后,在dfs函数里执行res = max(res, 2 + left + right)时,Python会把这个res判定为局部变量——因为你对它做了赋值操作。但这个局部变量在赋值前没有被定义,运行时就会抛出UnboundLocalError。而用列表
res = [0]时,你并没有对res变量本身重新赋值,只是修改了它指向的列表对象的第0个元素(res[0] = ...)。这种情况下,Python会自动在外层函数作用域查找res变量,找到后直接操作它指向的可变对象,不需要额外声明。
如果非要用普通变量实现,只需要在dfs函数开头加上nonlocal res声明,明确告诉Python这个变量来自外层函数的作用域,代码示例如下:
class Solution: def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int: res = 0 def dfs(root): nonlocal res # 声明res来自外层函数作用域 if not root: return -1 left = dfs(root.left) right = dfs(root.right) res = max(res, 2 + left + right) return 1 + max(left, right) dfs(root) return res
核心总结
- 普通变量的赋值操作会触发Python的局部变量判定逻辑,未用
nonlocal声明时会报错 - 列表属于可变对象,修改其内部元素不会改变变量本身的指向,因此可以直接访问外层作用域的变量
内容的提问来源于stack exchange,提问作者Mira Kumar
相关产品推荐
相关产品推荐

