views:

251

answers:

2

If i were to run this code:

def function(y):
    y.append('yes')
    return y

example = list()
function(example)
print(example)

Why would it return ['yes'] even though i am not directly changing the variable 'example', and how could I modify the code so that 'example' is not effected by the function?

+7  A: 

Everything is a reference in Python. If you wish to avoid that behavior you would have to create a new copy of the original with list(). If the list contains more references, you'd need to use deepcopy()

def modify(l):
 l.append('HI')
 return l

def preserve(l):
 t = list(l)
 t.append('HI')
 return t

example = list()
modify(example)
print(example)

example = list()
preserve(example)
print(example)

outputs

['HI']
[]
Vinko Vrsalovic
You can also create a copy of any list with `myList[:]`, but keep in mind this is a "shallow copy" meaning that the nth element of the new list refers to the same object as the nth element of the old one.
MatrixFrog
Good point, MatrixFrog
Vinko Vrsalovic
+2  A: 

"Why would it return ['yes']"

Because you modified the list, example.

"even though i am not directly changing the variable 'example'."

But you are, you provided the object named by the variable example to the function. The function modified the object using the object's append method.

As discussed elsewhere on SO, append does not create anything new. It modifies an object in place.

See http://stackoverflow.com/questions/1682567/why-does-pythons-list-append-evaluate-to-false, http://stackoverflow.com/questions/2022031/python-append-vs-operator-on-lists-why-do-these-give-different-results, http://stackoverflow.com/questions/1918270/python-lists-append-return-value.

and how could I modify the code so that 'example' is not effected by the function?

What do you mean by that? If you don't want example to be updated by the function, don't pass it to the function.

If you want the function to create a new list, then write the function to create a new list.

S.Lott