Метод list() в Python возвращает непустой список. Почему так?
Типичная ошибка, которая рассматривается в каждом учебнике по питону.
Во-первых, list - это не метод, а тип, который инстанцируется в список, если его вызвать.
Во-вторых, вот в этой строчке def __init__(self, elements=list()): создаётся список. Он создаётся оин единственный раз при объявлении класса. Значение этого списка будет присвоено аргументу elements по умолчанию при каждом вызове конструктора без указания этого аргумента.
То есть один и тот же список будет сохранён в атрибутах всех объектов этого типа, которые были инстанцированы без указания параметра.
У всесх ваших таких экземплярах внутри ссылка на один и тот же список. Если через одну ссылку в список добавить элеенты, то через другую ссылку доступен тот е самый список с уже добавленными элементами.
Так это работает в питоне. В значение по умолчанию нельзя указывать изменяемый тип. Он создается один раз как поле функции, и при каждом вызовое функции будет этот один и тот же объект.
можно делать так:

def __init__(self, elements=None):
        self.elements = elements or list()