Mutability of function arguments?

Mike Meyer mwm at
Thu Dec 8 04:37:41 CET 2005

bonono at writes:
> Mike Meyer wrote:
>> "ex_ottoyuhr" <ex_ottoyuhr at> writes:
>> > I'm trying to create a function that can take arguments, say, foo and
>> > bar, and modify the original copies of foo and bar as well as its local
>> > versions -- the equivalent of C++ funct(&foo, &bar).
>> C++'s '&' causes an argument to be passed by reference. Python does
>> that with all arguments. Any changes you make to the argument in the
>> function will be seen in the caller unless you explicitly make a copy
>> to pass.
> except when foo and bar are bound to immutable objects.


> In C:
> int foo=1;
> int bar=2;
> void update(int *a, int *b) { *a=3; *b=4}
> update(&foo, &bar);

Note that this update is using an assignment statement, and thus
changing the arguments.

> In Python:
> foo=1
> bar=2
> def update(a,b): a=3; b=4
> update(foo,bar)

This update isn't changing the objects, it's rebinding the names in
the local name space. Since you didn't change the objects, there's no
change to see in the calling environment.

> Many people from C/C++ background would be tricked for this situation.

That's because they don't understand binding. Any language that has
bindings instead of has assignments will "trick" them this way.

Mike Meyer <mwm at>
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.

More information about the Python-list mailing list