On May 29, 1:30 pm, 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. > > 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:] -- http://mail.python.org/mailman/listinfo/python-list