Python class constructor with default arguments

Possible duplicate:
"Least Surprise" in Python: argument argument resolved by argument

Can someone explain the following weird behavior?

I have the following class:

class Zoo: def __init__(self,alist=[]): self.animals = alist def __len__(self): return len(self.animals) def add(self,a): self.animals.append(a) 

and when I do the following,

 In [38]: z=Zoo() In [39]: z.add(2) In [40]: z.add(23) In [41]: len(z) Out[41]: 2 In [42]: z2=Zoo() In [43]: len(z2) Out[43]: 2 

Why is z2.nimals not an empty list?

Thanks Matthias

+7
source share
2 answers

You change the default argument in your constructor (you just copy the link to the same list to each of your instances). You can fix it as follows:

 class Zoo: def __init__(self,alist=None): self.animals = alist or [] def __len__(self): return len(self.animals) def add(self,a): self.animals.append(a) 
+11
source

The default argument list is the same object for all instances, so assigning it to a member simply assigns a reference to the same object.

here is an example:

 >>> class foo(): ... def __init__(self, x = []): ... print id(x) ... >>> x = foo() 140284337344168 >>> y = foo() 140284337344168 >>> z = foo() 140284337344168 

you can see that x is the same object in all instances.

+4
source

All Articles