scope of function parameters

R

rusi

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 globalto 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 alwaysbe 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:]
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,736
Latest member
AdolphBig6

Latest Threads

Top