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