On Sun, May 29, 2011 at 1:30 AM, Henry Olders <henry.old...@mcgill.ca> wrote:
> I just spent a considerable amount of time and effort debugging a program. 
> The made-up code snippet below illustrates the problem I encountered:
>
> def main():
>        a = ['a list','with','three elements']
>        print a
>        print fnc1(a)
>        print a
>
> def fnc1(b):
>        return fnc2(b)
>
> def fnc2(c):
>        c[1] = 'having'
>        return c
>
> This is the output:
> ['a list', 'with', 'three elements']
> ['a list', 'having', 'three elements']
> ['a list', 'having', 'three elements']
>
> I had expected the third print statement to give the same output as the 
> first, but variable a had been changed by changing variable c in fnc2.

To be more accurate, the list object referred to by `a` was modified
through c, due to the fact that a, b, and c all refer to the very same
object in this case.

> It seems that in Python, a variable inside a function is global unless it's 
> assigned. This rule has apparently been adopted in order to reduce clutter by 
> not having to have global declarations all over the place.
>
> I would have thought that a function parameter would automatically be 
> considered local to the function.
<snip>
> Are there others who feel as I do that a function parameter should always be 
> local to the function? Or am I missing something here?

Function parameters *are* local variables. Function parameters are
indeed local in that *rebinding* them has no effect outside of the
function:

def foo(a):
    a = 42

def bar():
    b = 1
    foo(b)
    print b

bar() #=> outputs 1

As you've observed, *mutating* the object a variable refers to is
another matter entirely. Python does not use call-by-value and does
not copy objects unless explicitly requested to, as you've
encountered. But it does not use call-by-reference either, as my
example demonstrates. Like several other popular contemporary
languages, Python uses call-by-object for parameter passing; a good
explanation of this model can be found at
http://effbot.org/zone/call-by-object.htm  It's well worth reading.

Cheers,
Chris
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to