Totally Confused: Passing variables to functions

Achim Domma domma at
Thu Jun 5 10:33:00 CEST 2003

"Chuck" <cdreward at> wrote in message
news:m6ptdvg3p8dvcbpg7qhelb7s2i0slrk7b0 at

Sorry for the encrypted message, here's the right on:

Hi Chuck,

> def blah(arg):
>     arg.append(3)
> v = [1,2]
> blah(v)

This confused me also the first time, but it's very consistent and

v is not the list, v is a reference to the list. From this point of
view, all values are passed by value, but your function gets a value
which is a reference.

> But it's not, because if I say "arg = None" inside the function,
> "v" is unchanged.

Of course, arg is another variable holding a reference to the same
list as v. What you do is asign a new value to arg, so there is no
reason why v should be changed.

> Also, if I do something similar:
> def blah(arg):
>     arg = arg + 1
> v = 1
> blah(v)

Same as above.

> It seems that if you pass a mutable variable, you can change it,
> but only by using it's methods, ie arg.append(), and NOT by doing
> an "arg = (new value)".

See above: arg.append uses the passed reference and changes the
underlying object. arg = (new value) asigns a reference to the new
value to arg.

> And if you pass an immutable variable, you can't change it at all.

I you know that you don't get an immutable variable, but rather a
reference to an immutable value this makes absolutly sense.


More information about the Python-list mailing list