Mutability of function arguments?

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


bonono at gmail.com writes:
> Mike Meyer wrote:
>> "ex_ottoyuhr" <ex_ottoyuhr at hotmail.com> 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.

Wrong.

> 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
-- 
Mike Meyer <mwm at mired.org>			http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.



More information about the Python-list mailing list