[Python-Dev] Bug report: empty dictionary as default class argument

Idan Sofer i_sofer@yahoo.com
16 May 2001 10:53:25 +0300


--=-uNM1Q6eCX9JH/wGWUYU9
Content-Type: text/plain

Hello.

I have found a rather annoying bug in Python, present in both Python 1.5
and Python 2.0.

If a class has an argument with a default of an empty dictionary, then
all instances of the same class will point to the same dictionary,
unless the dictionary is explictly defined by the constructor.

I attach a piece of code that demostrates the problem

--=-uNM1Q6eCX9JH/wGWUYU9
Content-Type: text/x-python
Content-Disposition: attachment; filename=test.py
Content-Transfer-Encoding: 7bit

"""
Bug description:
    
A class is defined. in the __init__ method, we define an options "attribs" 
argument, which defaults to {}.

We create two instances of class foo, each of them without argument.

we then modify the attribs attribute in one of them. in a suprising manner, 
the change if reflected in BOTH instances, where it should only appear in the 
first one.

Workaround:

explictly define an empty dictionary as the argument, or define the empty dictionary
inside the method body.
    
"""


class foo:
    
    def __init__(self,attribs={}):
	self.attribs=attribs;
	return None;
    
print "";
print "Defining Two instances of class foo:";

print "a=foo()"
print "b=foo()"
a=foo();
b=foo();
print "";
print "The 'attribs' attribute of both looks like this:";
print "a.attribs = %s" % a.attribs
print "b.attribs = %s" % b.attribs
print ""
print "Now we modify 'attribs' in a:"
print 'a.attribs["bug"]= "exists"';
a.attribs["bug"]= "exists";
print ""
print "Now, things should now look like this:"
print "a.attribs = %s" % a.attribs
print "b.attribs = %s" % "{}";
print ""
print "However, things look like this:"
print "a.attribs = %s" % a.attribs
print "b.attribs = %s" % b.attribs


--=-uNM1Q6eCX9JH/wGWUYU9--