scope of function parameters

rusi rustompmody at gmail.com
Tue May 31 12:46:19 EDT 2011


On May 29, 1:30 pm, Henry Olders <henry.old... at 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.
>
> 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. It doesn't make sense to me to pass a global to a function as a parameter.
>
> One workaround is to call a function with a copy of the list, eg in fnc1 I would have the statement "return fnc2(b[:]". But this seems ugly.
>
> 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?
>
> Henry

You want a functional language.
You can simulate that in python by using tuples in place of lists.

fnc2(c):
  c[1] = 'having'
  return c
will of course then give you an error that tuples are not assignable
(which seems to be what you want?)

So you then use (something like)

fnc2(c):  return c[0:1] + c[2:]



More information about the Python-list mailing list