Проблема заключается в этой строке:
def __init__(self, lst=[], intg=0):
Вы не должны использовать список в качестве аргумента по умолчанию. При первом вызове __init__
без указания lst
интерпретатор Python определит пустой список []
. Последующие вызовы функции будут работать в том же списке , если lst
не указан, без объявления нового списка. Это вызывает странные проблемы.
Вместо этого следует использовать значение по умолчанию None
и добавить проверку в начале функции:
def __init__(self, lst=None, intg=0):
if lst is None:
lst = []
См. в этом посте для получения более подробной информации. Цитирую пост:
Аргументы по умолчанию оцениваются в
время определения функции, поэтому они
постоянный через звонки. Это имеет некоторые
интересная (и запутанная) сторона
последствия. Пример:
>>> def foo(d=[]):
... d.append('a')
... return d
Если
ты не пробовал это раньше, ты
вероятно ожидать, что foo всегда вернется
['a']
: должно начинаться с пустого
список, добавьте к нему «а» и вернитесь.
Вот что на самом деле делает:
>>> foo() ['a']
>>> foo() ['a', 'a']
>>> foo() ['a', 'a', 'a']
Это потому, что значение по умолчанию для d
распределяется, когда функция
создано, а не когда это называется. каждый
время вызова функции, значение
все еще болтается с последнего
вызов. Это становится еще более странным, если вы
бросать темы в смесь. Если два
разные потоки исполняют
функция в то же время, и один из
они изменяют аргумент по умолчанию, они
оба увидят изменения.
Конечно, все это верно только в том случае, если
значение аргумента по умолчанию является
изменчивый тип. Если мы изменим foo
на
определяется как
>>> def foo2(d=0):
... d += 1
... return d
тогда он всегда вернет 1.
(Разница здесь в том, что в foo2
,
переменная d
переназначается,
в то время как в foo
его значение было
изменено.)