On Mon, 12 Mar 2007, J Greg wrote: > Perhaps I don't understand. In the example below, the > first instance correctly creates a fresh dictionary. > But the second instance seems to inherit the now dirty > dictionary from the first instance. > > What am I missing?
This is a very common Python "gotcha," passing mutable objects as default arguments to a function. If you do a google search on "python gotchas" it will show up in pretty much every list of gotchas. The idiom to get around this is to instead use a default value of None, and then, if you actually see None in the function, set it equal to the real default argument you want, i.e.: class newobj: def __init__(self, labl, d = None ): # changed line if d is None: # added line d = {} # added line print labl, d, '\n' # print the dictionary as passed, or freshly created if d.has_key('obj1'): d['obj2'] = 'very dirty' d['obj1'] = 'dirty' Now your code: obj1 = newobj('obj1:') # ok obj2 = newobj('obj2:') # gets the dirty dictionary from obj1 dd = dict(obj3=True) obj3 = newobj('obj3:', dd) # ok obj4 = newobj('obj4:') # get a dirty dictionary from obj2 Gets: obj1: {} obj2: {} obj3: {'obj3': True} obj4: {} Is that more what you were expecting? _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor