Python将类变量作为引用传递给类方法

Python将类变量作为引用传递给类方法,python,class,reference,Python,Class,Reference,我有下面的python代码,它将AVL树的根设置为指定的值。 但是,当通过同一类中的函数传递时,设置类的根变量似乎没有效果 class AVLTree: class AVLNode: def __init__(self, value) -> None: self.value = value def __init__(self) -> None: self._root = None def insert

我有下面的python代码,它将AVL树的根设置为指定的值。 但是,当通过同一类中的函数传递时,设置类的根变量似乎没有效果

class AVLTree:
    class AVLNode:
        def __init__(self, value) -> None:
            self.value = value

    def __init__(self) -> None:
        self._root = None

    def insert(self, value: int) -> None:
        return self._insert(value, self._root)

    def _insert(self, value, node):
        if node is None:
            node = value
        return


avl = AVLTree()
avl.insert(5)
print(avl._root)

打印
None

似乎将类变量
self.\u root
作为参数传递给成员方法不会改变其值

我了解到python通过引用传递所有类成员,并且只将不可变类型(int等)作为值传递


知道我为什么不能在
\u insert
函数中修改
self.\u root
的值吗?我该怎么做?谢谢

您可以完全控制如何调用
\u insert
。只是不要用
node=None
调用它。差不多

def insert(self, value: int) -> None:
    if self._root is None:
        self._root = self.AVLNode(value)
    else:
        self._insert(value, self._root)

def _insert(self, value, node):
    # Assume node is not None
    ...

(不相关,您的
AVLNode
类还必须存储指向其两个子类的指针,并且
\u insert
需要适当地更新这些指针。)

Python以相同的方式传递所有对象–类成员和不可变类型之间没有区别
self.\u root
求值为
self.\u root
引用的对象,该对象被传递。对象不知道它的任何别名,包括
self.\u root
。您似乎想要有
self.\u root
同时引用
self.\u root
如果节点为None
)的值和表达式
self.\u root
节点=值
),对吗?None是值。您必须传递一个可以修改的对象。有关表达式及其值分离的相关问题:和值引用语义:您好,谢谢,但是在root初始化'self.\u root=AVLNode(value)`之后,调用
\u insert
(else子句)。。然后,如果我对node(我假设它是_root)进行更改,那么这些更改将不会持续。。这就是我正在使用的,根据您的代码在
insert
中设置根目录后,如果我将根目录传递给
\u insert
然后尝试添加子目录,它们将永远不会被添加。。当传递到
\u insert
作为
节点时,我似乎无法使用root。即使它已经初始化,也不是无。有线索吗?(root从未有过左撇子或右撇子)我认为“无关”可能是我上面评论中问题的解决方案,谢谢我会看一看!请记住,当您尝试将值插入到现有树中时,它将分为以下三种情况之一:1)它已经存在于根值中2)它需要插入到左子树中3)它需要插入到右子树中。AVL树使这有点复杂,因为任何给定的插入都可能导致旋转,从而改变哪个节点被视为根,从而保持高度不变。