我在练习 LeetCode 时,对解决方案的 self 范围感到困惑。我认为 self 是 DiameterOfBinaryTree() 的局部变量,因此根据 LEGB 作用域规则,嵌套函数 height() 应该只能读取 self.ans 而不能修改它。那么在这个解决方案中 height() 如何修改 self.ans 呢?谢谢!
附注我无法正确设置“class Solution(object):”格式,因此假设缩进是正确的。
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 0
def height(p):
if not p: return -1
left, right = height(p.left), height(p.right)
self.ans = max(self.ans, 2+left+right)
return 1+max(left, right)
height(root)
return self.ans
最佳答案
您的大部分推理都是正确的,除了一件事:self.ans = ...
不会重新绑定(bind)非本地范围中的任何内容。相反,.=
运算符是 setattr(self, 'ans', ...)
的语法糖。显然,函数调用不会以任何方式违反 LEGB,因为对 self
的引用是只读的。
举一个更简单的例子,考虑一下 some_list.extend([1, 2, 3])
与 some_list += [1, 2, 3]
之间的区别。前者是一个方法调用,恰好修改了一个可变对象,而后者则尝试重新分配引用。
关于python - 嵌套函数如何更改其封闭函数的实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73199601/