Danny Liu
Danny Liu

Reputation: 519

python string vs list odd behaviour

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

Answers (3)

nino_701
nino_701

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

Brian
Brian

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

kofemann
kofemann

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

Related Questions