【问题标题】:How python pass by reference?python如何通过引用传递?
【发布时间】:2014-01-15 19:57:23
【问题描述】:

我尝试在 BST 中实现删除节点。 这是我的部分代码。

def delete(node,key):
#Locate that node with value k
    cNode=node
    target=None
    while cNode:
        if cNode.value==key:
            target=cNode
            break
        elif node.value>key:
            cNode=cNode.lChild
        elif node.value<key:
            cNode=cNode.rChild
    target=None
    return node

当我尝试使用上述方法删除叶节点时。我失败了。当方法返回时,它对原始 BST 没有任何作用。那么这段代码有什么问题呢?我认为它应该有一些关于 python 如何通过引用传递参数的信息?但我现在很困惑。 提前谢谢了。

【问题讨论】:

  • 这里没有代码可以从你的树中删除任何东西。您可能需要切断父母和孩子之间的联系
  • 但是我将叶子节点的目标节点设置为None,它也应该改变原来的树,对吧?
  • Python 已经通过引用传递了;它从不默默地复制任何东西。但它不会通过引用传递 variables ,因为那将毫无意义; Python 变量不是内存位置,它们只是某个命名空间中的名称。
  • @lexie,不,target 只是你的 delete 函数中的一个局部变量,你将它设置为 None。
  • @nos:我认为 OP 明白这一点,否则他不会问这个问题;他只是不明白为什么这是真的,或者他应该怎么做。

标签: python pass-by-reference


【解决方案1】:

target = None重新绑定变量 target 到新值 Nonetarget 之前绑定的任何内容都不会改变。

您必须跟踪 父节点,并将其 lChildrChild 属性设置为 None

def delete(node,key):
    cNode = node
    target = parent = None
    while cNode:
        if cNode.value == key:
            target = cNode
            break
        elif cNode.value > key:
            parent, cNode = cNode, cNode.lChild
        elif cNode.value < key:
            parent, cNode = cNode, cNode.rChild

    if target:
        if parent:
            if parent.lChild is target:
                parent.lChild = None
            else:
                parent.rChild = None
        else:
            # target is top-level node; perhaps return None in that case?
    return node

【讨论】:

  • 谢谢 Martjin,我明白了我的问题。
  • 是的,我会的,看来我只能在 2 分钟内做到这一点
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2012-03-30
  • 2017-08-12
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多