Reputation: 162
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.
Upvotes: 0
Views: 1151
Reputation: 18908
Python is pass by assignment. Within your BinaryTree._insertInternal
the assignment of root
argument (also the local variable within the scobe of that method) is initially assigned the value of the root node (in this case, the value is an object reference), and the statement root = Node(None, None, value)
is a new assignment, thus it becomes different to the initially passed in thus different to the instance's self.root
.
Upvotes: 2