对传递给函数的对象的引用 Python

Reference to object passed to function Python

为了进一步了解 Python 的对象和 类,我为二叉搜索树编写了一些代码。

对于 delete 方法,当我尝试更改节点指向的内容时,python 正在创建一个新变量,而不是更改传递给该方法的节点。我如何才能更改方法中指向的节点?[​​=12=]

class Node:

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


class BST:

def __init__(self):
    self.root = None
    self.length = 0

def insert(self, data):

    if not self.root:
        temp = Node()
        temp.data = data
        self.root = temp
    else:
        return self._insert(self.root, data)

def _insert(self, node, data):

    if node.data <= data:
        if not node.right:
            temp = Node()
            temp.data = data
            node.right = temp
            return
        else:
            self._insert(node.right, data)
    else:
        if not node.left:
            temp = Node()
            temp.data = data
            node.left = temp
            return
        else:
            self._insert(node.left, data)

def delete(self, data):

    return self._delete(self.root, data)

def _delete(self, node, data):

    if not node:
        return False
    elif node.data < data:
        return self._delete(node.right, data)
    elif node.data > data:
        return self._delete(node.left, data)
    else:
        if not node.left and not node.right:
            node = None
        elif not node.left:
            node = node.right
        elif not node.right:
            node = node.right
        else:
            temp = self.findmin(node.right)
            #or find max of left
            node.data = temp.data
            self._delete(node.right, temp.data)

def findmin(self, node):
    if not node:
        return None
    while node.left:
        node = node.left
    return node

这不是 python 问题,这对于使用指针(而不是 C++ 样式引用)的每种语言都是一样的。在删除操作期间,您应该将 父节点的 节点引用的指针更改为其子节点。你有一个形式的结构

       parent
       /   \
     node  ...
     /  \
child1  child2

删除 node 时,您必须将 parent children 更改为新的,而不是尝试将新值分配给 "node" 变量,这不是指向任何地方。因此你最终会得到类似的东西:

       parent
       /    \
     child1  ...
     /  \
child2  ...