При вызове инициализации через super появляются старые данные

Два раза вызываю инициализацию класса и результат разный. Подозреваю, что дело в памяти, но где? Питон 3

Почему при вызове этого примера в консоль будет напечатано сначала 0, а потом 1(длина поданной на вход переменной в родительском классе)?

class A:
    def __init__(self, mainer={}):
        print(len(mainer))
        self.mainer = mainer
        self.performer()

    def performer(self):
        pass


class B(A):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def performer(self):
        self.mainer["da"] = "da"


b = B()
b = B()

Более того. Так же работает и такой пример кода.

class B:
    def __init__(self, mainer={}):
        print(mainer)
        self.mainer = mainer
        self.mainer["da"] = "da"


b = B()
b = B()

Ответы (1 шт):

Автор решения: Miroslav Morozov

Дело в изменяемом значении аргумента по умолчанию. Это описано, например, здесь https://codecamp.ru/blog/python-common-pitfalls/ в главе с нужным названием. Ошибка действительно глупая. Дело вот в чем: при передаче изменяемых параметров по умолчанию в функцию(как например у меня), объект создается ровно при первом запуске этого кода и затем не исчезает. Т.е. при первом запуске я брал эти словари, видоизменял их, а при повторном передавал по умолчанию те же самые объекты, т.е. уже заполненные. Единственный адекватный способ это исправить ,который мне известен, это писать так:

def func(a=None):
    if not a:
        a = {}
→ Ссылка