6

Can anyone explain to me why the two functions below a and b are behaving differently. Function a changes names locally and b changes the actual object.

Where can I find the correct documentation for this behavior?

def a(names):
    names = ['Fred', 'George', 'Bill']

def b(names):
    names.append('Bill')

first_names = ['Fred', 'George']

print "before calling any function",first_names
a(first_names)
print "after calling a",first_names
b(first_names)
print "after calling b",first_names

Output:

before calling any function ['Fred', 'George']
after calling a ['Fred', 'George']
after calling b ['Fred', 'George', 'Bill']
1

2 Answers 2

7

Assigning to parameter inside the function does not affect the argument passed. It only makes the local variable to reference new object.

While, list.append modify the list in-place.

If you want to change the list inside function, you can use slice assignment:

def a(names):
    names[:] = ['Fred', 'George', 'Bill']
Sign up to request clarification or add additional context in comments.

Comments

1

Function a creates a new, local variable names and assigns list ['Fred', 'George', 'Bill'] to it. So this is now a different variable from the global first_names, as you already found out.

You can read about modifying a list inside a function here.

One way to make function a behave the same as function b is to make the function a modifier:

def a(names):
    names += ['Bill']

Or you could make a pure function:

def c(names):
    new_list = names + ['Bill']
    return new_list

And call it:

first_names = c(first_names)
print first_names
# ['Fred', 'George', 'Bill']

A pure function means it doesn't change the state of the program, i.e. it doesn't have any side effects, like changing global variables.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.