Python通过引用传递类的实例

2024-09-30 05:24:11 发布

您现在位置:Python中文网/ 问答频道 /正文

所以Python并没有真正做到这一点。我有一个名为tree的类,它是一个二叉树类型。在

class Tree(object):
    def __init__(self):
        self.left = None
        self.right = None
        self.data = None

    def filler(self, lista, tree):
        tree = Tree()
        nr = len(lista)
        nr //= 2
        if len(lista) == 0:
            return
        if len(lista) == 1:
            tree.data = lista[0]
            return
        tree.data = lista[nr]
        self.filler(lista[:nr], tree.left)
        self.filler(lista[nr:], tree.right)

函数filler()将列表转换为二叉树。我试着这样称呼它:

^{pr2}$

结果是Nonefiller()不执行任何操作。我能做点什么吗?我可以通过引用传递tr2对象吗?如果不能通过引用传递列表,如何将其转换为二叉树?在

在填充物中没有树倒立的回溯:

Traceback (most recent call last):
  File "D:/Projects/Python/AIExcavator/src/ui.py", line 75, in <module>
    uier.inter()
  File "D:/Projects/Python/AIExcavator/src/ui.py", line 63, in inter
    tr.filler(l, tr2)
  File "D:\Projects\Python\AIExcavator\src\Backtracking.py", line 79, in filler
    self.filler(lista[:nr], tree.left)
  File "D:\Projects\Python\AIExcavator\src\Backtracking.py", line 78, in filler
    tree.data = lista[nr]
AttributeError: 'NoneType' object has no attribute 'data'

Tags: inpyselfsrcnonetreedataline
2条回答

filler无论如何都有点奇怪,因为它只需要self来进行递归调用。它实际上是一个替代构造函数,使它更适合作为类方法,类似于

class Tree(object):

    def __init__(self, data=None, left=None, right=None):
        self.left = left
        self.right = right
        self.data = data

    # The former method filler()
    @classmethod
    def from_list(cls, lista):
        if lista:
            # All non-empty lists are the same.
            # Specifially, nr = 0 for a single-element list,
            # and lista[:nr] and lista[nr+1:] are empty lists
            # in the edge cases.
            nr = len(lista) // 2
            return cls(lista[nr],
                        cls.from_list(lista[:nr]),
                        cls.from_list(lista[nr+1:]))
        else:
            return None

tree = Tree.from_list([1,2,3,4,5,6])

使用类方法的好处是可以定义Tree的子类,而不必重新定义from_list。考虑

^{pr2}$

尽管BackwardsTree.from_list解析为Tree.from_list,因为您没有重写该函数,但返回值仍将是BackwardsTree的实例,而不是{},因为您使用了cls来创建每个(子)树,而不是在方法内部对Tree进行硬编码。在

你写的

tr.filler(l, tr2)

但是在filler中,你不用tr2,因为你用一个新的树对象来删除它。在

^{pr2}$

而且,正如评论中指出的

self.filler(lista[:nr], tree.left)
self.filler(lista[nr:], tree.right)

错误,因为您传递了tree.lefttree.right,它们都是None,而{}需要一个tree对象,而不是{}。在

关于通过引用传递,您应该阅读Python中的mutables。TL;DR:如果您将tr2传递给filler,并在filler中修改它,它确实会被修改。在

相关问题 更多 >

    热门问题