Totally Confused: Passing variables to functions

W Isaac Carroll icarroll at pobox.com
Thu Jun 5 04:20:58 EDT 2003


Chuck wrote:
> I've hit a stumbling block while trying to pick up Python. I've googled
> around, and I don't think I'm the first to have this question, but I haven't
> been able to find an answer that explains things for me.

[snip]

> ... This gives me the impression that Python passes variables by reference (by
> a "pointer"), and the "arg" in blah is the same as "v".

[snip]

> I get the impression Python passes variables by copy.
> 
> *Huh?*
> 
> 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)".
> 
> And if you pass an immutable variable, you can't change it at all.

You are correct.

> This doesn't seem very intuitive, which leads me to believe I'm missing "the
> big picture".

Right. It's not intuitive to a C programmer. See below for why.

> In the python tutorial, it says:
> 
>    Actually, call by object reference would be a better description,
>    since if a mutable object is passed, the caller will see any changes
>    the callee makes to it (items inserted into a list).
> 
> But I don't understand what "object reference" means. I'm familiar with "pass
> by copy" and "by reference(pointer)" in the Pascal or C languages...

"Call by object reference" is used because the "call by reference" vs 
"call by value" distinction tends to give people the wrong idea about 
Python. There was a long discussion of the subject recently that you 
should look at if you're interested in the arguments for and against 
that term.

My understanding is that Python is technically "call by value", but that 
description leaves out the vital point that the only values in python 
are references. :)

> What's going on? (*grin*)

In order to understand argument passing in Python, you have to 
understand what variables and objects are in Python.

In C, a variable is a named piece of memory that you can put stuff into. 
In Python, a variable is just a name. It doesn't have a type, and it 
only stores a reference to an object.

An object in Python is a nameless piece of memory that you can put stuff 
into. It has a type and it may have attributes and methods (what would 
be called data and function members in C++).

When you pass a variable to a function, you're actually passing a 
reference to the variable's object. If the function tells that object to 
change its value, the change is visible to the caller. If the function 
creates a new object, the value of the original object (and the caller's 
reference to it) will not be affected.

I think that this could be described as the "big picture" of Python. It 
seems to be the most common stumbling block for new Pythoners coming 
from a C (and relateds) background.

TTFN






More information about the Python-list mailing list