On 12/5/05, Kent Johnson <[EMAIL PROTECTED]> wrote:
>
> You have to change how you think about variables. In Python, a variable
> is not a storage location into which values are put, it is a reference
> to an object - a name given to an object. Assignment binds a name to a
> value.
>
> When you call a function, the names of the formal parameters are bound
> to the values passed in to the function. Parameters are *always* passed
> by reference.


hans,

kent makes some good points here that you need to master.  to further
elaborate, here are three things to keep in mind:

1) in Python, everything is an object, and all names are just
references or aliases to those objects.

2) managing these objects is based on how many references exist that
point to an object -- this is called a "reference count."  objects are
"deallocated" when an object's reference count goes to zero.

3) there are both mutable (can be changed) and immutable (cannot be
changed without creating a new one) objects.  lists and dictionaries
are mutable while numbers, strings, and tuples are not.

in your example, you passed in a list by reference.  that list had a
reference count of 1 when you created it; when you passed it to the
function, a new reference, local to the called function, is created
for that object, incrementing its reference count by 1, and now it
totals 2. (a side note here: that only mutable objects have methods.) 
you then called a method [[].append()] which alters that object, which
it did.  in the function, you only had access to the 2nd alias to the
list, but it doesn't matter whether you used this one, or called the
list's method from the global code using the original reference as
either would affect the list the way it did.  note that when the
function concluded, the local variable went away, decrementing the
list object's reference count back down to 1.

in your second example, you almost did the exact same thing.  you
*did* pass the list in as an argument, creating another reference to
the list object, incrementing its reference count to 2.  but in this
case, you immediately "wiped" access to that object by reassigning
that variable name to point to something else, an integer.  all you
did here was to decrement the reference count to the list object by
one (back to 1).  the outer print gave the expected output because you
just passed that integer object back to the calling function.

hope this helps!
-- wesley
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
"Core Python Programming", Prentice Hall, (c)2006,2001
    http://corepython.com

wesley.j.chun :: wescpy-at-gmail.com
cyberweb.consulting : silicon valley, ca
http://cyberwebconsulting.com
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to