Поскольку аргументы по умолчанию оцениваются только один раз, когда функция оценивается и создается (они являются частью определения функции и могут быть получены, например, через inspect.getargspec).
Поскольку они являются частьюфункции, каждый вызов функции будет иметь один и тот же экземпляр значения по умолчанию.Это не проблема, если это неизменяемое значение, но как только оно будет изменяемым, оно может стать уловкой.
Та же «особенность» существует в определениях классов, учитывая определение классов:
class A(object):
foo = {}
вызов
x = A()
y = A()
x.foo['bar'] = "baz"
... даст y.foo ['bar'] значение "baz", поскольку x и y имеют одинаковое foo.Вот почему инициализация члена должна выполняться в init вместо тела класса.