Python class constructor with default arguments

oop, python

Solution

You are mutating the default argument in your constructor (you are just copying a reference to the same list into each of your instances). You can fix this 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)

Problem

Possible Duplicate: “Least Astonishment” in Python: The Mutable Default Argument Can anyone explain the following strange behaviour? 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.animals not an empty list? Thanks, Matthias

Original source

Related problems