function parameter scope python 2.5.2

J Kenneth King james at agentultra.com
Thu Nov 20 18:40:02 EST 2008


J Kenneth King <james at agentultra.com> writes:

> I recently encountered some interesting behaviour that looks like a bug
> to me, but I can't find the appropriate reference to any specifications
> to clarify whether it is a bug.
>
> Here's the example code to demonstrate the issue:
>
> class SomeObject(object):
>
>     def __init__(self):
>         self.words = ['one', 'two', 'three', 'four', 'five']
>
>     def main(self):
>         recursive_func(self.words)
>         print self.words
>
> def recursive_func(words):
>     if len(words) > 0:
>         word = words.pop()
>         print "Popped: %s" % word
>         recursive_func(words)
>     else:
>         print "Done"
>
> if __name__ == '__main__':
>     weird_obj = SomeObject()
>     weird_obj.main()
>
>
> The output is:
>
> Popped: five
> Popped: four
> Popped: three
> Popped: two
> Popped: one
> Done
> []
>
> Of course I expected that recursive_func() would receive a copy of
> weird_obj.words but it appears to happily modify the object.
>
> Of course a work around is to explicitly create a copy of the object
> property befor passing it to recursive_func, but if it's used more than
> once inside various parts of the class that could get messy.
>
> Any thoughts? Am I crazy and this is supposed to be the way python works?

Of course, providing a shallow (or deep as necessary) copy makes it
work, I'm curious as to why the value passed as a parameter to a
function outside the class is passed a reference rather than a copy.



More information about the Python-list mailing list