H
Henry Olders
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
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