Python 建树时如何参照传递?

Python 建树时如何参照传递?,python,python-3.x,Python,Python 3.x,我想创建一个对象,让我们称之为模型,它包括一个属性,二叉树的根。我希望这个模型对象有一个方法,可以构建一个特定深度的二叉树 我创建了这样一个类,model,它使用一个树节点类binary\u tree\u node,如下所示: 类二叉树节点: 定义初始化(自身,数据): self.data=数据 self.left\u child=无 self.right\u child=无 类别模型: 定义初始深度(自身,最大深度=3): self.root=None self.max\u depth=最大深

我想创建一个对象,让我们称之为模型,它包括一个属性,二叉树的根。我希望这个模型对象有一个方法,可以构建一个特定深度的二叉树

我创建了这样一个类,
model
,它使用一个树节点类
binary\u tree\u node
,如下所示:

类二叉树节点:
定义初始化(自身,数据):
self.data=数据
self.left\u child=无
self.right\u child=无
类别模型:
定义初始深度(自身,最大深度=3):
self.root=None
self.max\u depth=最大深度
def生成树(自):
self.build\u tree\u recursive\u helper(self.root,0)
def build_tree_recursive_helper(自身、节点、当前深度):
#创建新节点
节点=二叉树节点(“数据”)
#检查基本情况
如果当前深度>=self.max\u深度:
返回
#进行递归调用
self.build\u tree\u recursive\u helper(node.left\u子级,当前\u深度+1)
self.build\u tree\u recursive\u helper(node.right\u子节点,当前\u深度+1)
我希望能够实例化模型,构建树,然后反思树,就像这样

m=model()
m、 构建树()
打印(m.root.data)
>>>“数据”
但是,在尝试反省时,我得到了以下信息:

m=model()
m、 构建树()
打印(m.root.data)

AttributeError回溯(最近一次调用)
在里面
1米=型号()
2 m.建造树()
---->3打印(m.root.data)
AttributeError:“非类型”对象没有属性“数据”
这违背了我对python传递对象引用而不是值的理解


我应该如何修改我的
二叉树\u节点
模型类
,以实现我的预期结果?

为什么不返回生成的节点并获取引用,类似于下一个:

max_depth = 4

def build_tree_recursive_helper(current_depth): 
    # check base case
    if current_depth >= max_depth:
        return None 

    node = binary_tree_node('data')

    # make recursive calls
    node.left_child = build_tree_recursive_helper(current_depth + 1)
    node.right_child = build_tree_recursive_helper(current_depth + 1)

    return node

请注意,您必须将
self
放回您的实现中。

请阅读以下内容:您基本上必须重写递归方法,以便不将某些内容分配给
节点,然后递归地填充该节点的子节点,而是递归地创建一个节点+子节点并返回它,然后将该返回值赋给self.root
。Python不支持按引用调用语义。支持的唯一评估策略是“按共享呼叫”,即按任务呼叫。这里的问题是,您的
build\u tree
方法对它构建的节点没有任何作用,它们只是被丢弃了。有一个常见的误解,传递一个引用意味着“通过引用调用”。这是不正确的。C只支持按值调用。当然,您可以将引用(指针)作为参数传递。通过引用调用的区别在于,函数中该参数的赋值可以在调用方中看到。因此,假设我们在Python中使用了引用调用以及它的正常策略,我们使用
&
来表示这样一个参数,
def Foo(&x):x=42;a=0;傅(甲),;打印(a)
将打印42。