При вызове инициализации через 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 шт):
Дело в изменяемом значении аргумента по умолчанию. Это описано, например, здесь https://codecamp.ru/blog/python-common-pitfalls/ в главе с нужным названием. Ошибка действительно глупая. Дело вот в чем: при передаче изменяемых параметров по умолчанию в функцию(как например у меня), объект создается ровно при первом запуске этого кода и затем не исчезает. Т.е. при первом запуске я брал эти словари, видоизменял их, а при повторном передавал по умолчанию те же самые объекты, т.е. уже заполненные. Единственный адекватный способ это исправить ,который мне известен, это писать так:
def func(a=None):
if not a:
a = {}