I am wondering which of the arguments in the call self._insertInteral(value, self.root.rightChild) are by value and which are by reference? I am still learning Python and was reading about the pass by object methodology in Python. I think my misunderstanding on the topic may be the reason why my function for inserting into a binary tree does not result in the value being inserted. 
Here is my code:
 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
I did checkout this post Understanding Python's call-by-object style of passing function arguments but was wondering about this example specifically.
 
     
    