On Nov 20, 6:40 pm, J Kenneth King <[EMAIL PROTECTED]> wrote: > J Kenneth King <[EMAIL PROTECTED]> 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.
Why should it be a copy by default ? In Python all copies have to be explicit. George -- http://mail.python.org/mailman/listinfo/python-list