Python将类变量作为引用传递给类方法
我有下面的python代码,它将AVL树的根设置为指定的值。 但是,当通过同一类中的函数传递时,设置类的根变量似乎没有效果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
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树使这有点复杂,因为任何给定的插入都可能导致旋转,从而改变哪个节点被视为根,从而保持高度不变。