Python中的这些参数是通过值还是通过引用传递的?

时间:2016-05-24 11:56:05

标签: python

我想知道调用self._insertInteral(value, self.root.rightChild)中的哪些参数是按值而哪些是参考?我还在学习Python,并且正在阅读Python中的对象方法论。我认为我对该主题的误解可能是我插入二叉树的函数不会导致插入值的原因。

这是我的代码:

 class Node:
    def __init__(self, leftChild, rightChild, value):
        self.leftChild = leftChild
        self.rightChild = rightChild
        self.value = value

class BinaryTree:
    def __init__(self, root):
        self.root = root
    def _insertInternal(self, value, root):
        if root is None:
            root = Node(None, None, value)
            print 'new node, root.value = ' + str(root.value)
            return
        if root.value > value:
            self._insertInternal(value, root.leftChild)
        else:
            self._insertInternal(value, root.rightChild)

    def insert(self, value):
        print 'attempting to insert value = ' + str(value)
        if self.root is None:
            self.root = Node(None, None, value)
            return
        elif self.root.value > value:
            print str(self.root.value) + '>' + str(value)
            self._insertInternal(value, self.root.leftChild)
        else:
            print str(self.root.value) + '<' + str(value)
            self._insertInternal(value, self.root.rightChild)


if __name__ == '__main__':
    root = Node(None, None, 10)
    tree = BinaryTree(root)
    print tree.root.leftChild
    print tree.root.rightChild
    print tree.root.value


    tree.insert(5)

    print tree.root.leftChild
    print tree.root.rightChild
    print tree.root.value

我确实查看了这篇文章Understanding Python's call-by-object style of passing function arguments但是特别想知道这个例子。

1 个答案:

答案 0 :(得分:2)

Python是pass by assignment。在BinaryTree._insertInternal内,root参数的赋值(也是该方法的scobe中的局部变量)最初被赋予根节点的值(在这种情况下,该值是对象引用),并且语句root = Node(None, None, value)是一个新的赋值,因此它与最初传入的不同,因此与实例的self.root不同。