Reputation: 519
If I try the following snippets of code on a binary tree, and try to print the arr and string later, arr gives me the correct result but string is empty. Any thoughts? Is it something to do with lists being passed by reference and strings passed by value?
def post_order(root, arr = []):
if(root is not None):
post_order(root.left, arr)
post_order(root.right, arr)
arr.append(root.value)
def post_order1(root, string = ''):
if(root is not None):
post_order1(root.left, string)
post_order1(root.right, string)
string += str(root.value)
# assume I've made my binary tree
arr, string = [], ''
post_order(root, arr)
post_order1(root, string)
print arr, string
# arr holds the correct post-order sequence
# string is empty
Upvotes: 0
Views: 91
Reputation: 692
You should rectify your code like this:
def post_order1(root, string = ''):
if not root : return string
left = post_order1(root.left, string)
right = post_order1(root.right, left)
return right + str(root.value)
Upvotes: -1
Reputation: 1667
In Python, lists are mutable and strings are immutable. This means that a list can be modified, but a string cannot. Strings can only be reassigned.
In your function, you are modifying the list using .append()
, but you are only reassigning your string +=
Upvotes: 2
Reputation: 4413
Arr is an array, which you extend. String passed to post_order1 is an immutable object and a copy is created when updated. As a result, the original string stays unchanged.
Upvotes: 1