initializing with empty list as default causes freaky problems

MRAB python at mrabarnett.plus.com
Mon Jul 27 13:55:57 EDT 2009


Reckoner wrote:
> Hi,
> X-Antispam: NO; Spamcatcher 5.2.1. Score 50
> 
> Observe the following:
> 
> In [202]: class Foo():
>    .....:     def __init__(self,h=[]):
>    .....:         self.h=h
>    .....:
>    .....:
> 
> In [203]: f=Foo()
> 
> In [204]: g=Foo()
> 
> In [205]: g.h
> Out[205]: []
> 
> In [206]: f.h
> Out[206]: []
> 
> In [207]: f.h.append(10)
> 
> In [208]: f.h
> Out[208]: [10]
> 
> In [209]: g.h
> Out[209]: [10]
> 
> The question is: why is g.h updated when I append to f.h?  Shouldn't
> g.h stay []?
> 
> What am I missing here?
> 
> I'm using Python 2.5.1.
> 
Default arguments are evaluated once and then shared, so don't use them
with mutable objects like lists. Do this instead:

     class Foo():
         def __init__(self, h=None):
             if h is None:
                 self.h = []
             else:
                 self.h = h



More information about the Python-list mailing list