python - 嵌套函数如何更改其封闭函数的实例变量?

标签 python scope self

我在练习 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/

相关文章:

python - lxml 获取元素的完整扩展名

Python - 如何使用 python 在 word 文档中嵌入 OLE

python - 为什么我不能修改作为函数内部参数传递的列表?

jquery - $.getJSON、$.each 和变量范围

scala - 为什么 Scala 编译器在 2.10 中对 self 类型变得更加严格?

python - 如何在 Python 中避免显式 'self'?

python - Python 新手 : Anyone know what __init__(self) does?(请简单解释!)

python - 如何使用 Python 从 Selenium 的重定向链中获取中间 URL?

python - 在 python xmpp 中检索 gtalk 昵称

for-loop - CFSCRIPT - For 循环递增索引错误