Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #6523

Re: scope of function parameters

References <F8395F78-615E-4FBD-B6FC-1D6173EAEA45@mcgill.ca>
Date 2011-05-29 03:01 -0700
Subject Re: scope of function parameters
From Chris Rebert <crebert@ucsd.edu>
Newsgroups comp.lang.python
Message-ID <mailman.2218.1306663324.9059.python-list@python.org> (permalink)

Show all headers | View raw


On Sun, May 29, 2011 at 1:30 AM, Henry Olders <henry.olders@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

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

Re: scope of function parameters Chris Rebert <crebert@ucsd.edu> - 2011-05-29 03:01 -0700

csiph-web