@Nickellick

Метод list() в Python возвращает непустой список. Почему так?

Есть такая программа:
class A():
    def __init__(self, elements=list()):
        self.elements = elements

    def add(self, elem):
        self.elements.append(elem)

    def __str__(self):
        return str(self.elements)

a = A()
a.add('a')
a.add('b')
b = A()
print(b)

На выходе получаем
['a', 'b']
Откуда? Ведь объект b пустой!
  • Вопрос задан
  • 280 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
list()
Выполняется только один раз при инициализации, при этом возвращает пустой список, и затем, когда вы добавляете новые элементы, они остаются в этом списке
Посмотрите https://docs.python-guide.org/writing/gotchas/#mut...
Там же есть и решение, которое нужно использовать - https://docs.python-guide.org/writing/gotchas/#wha...

def append_to(element, to=None):
    if to is None:
        to = []
    to.append(element)
    return to
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Типичная ошибка, которая рассматривается в каждом учебнике по питону.
Во-первых, list - это не метод, а тип, который инстанцируется в список, если его вызвать.
Во-вторых, вот в этой строчке def __init__(self, elements=list()): создаётся список. Он создаётся оин единственный раз при объявлении класса. Значение этого списка будет присвоено аргументу elements по умолчанию при каждом вызове конструктора без указания этого аргумента.
То есть один и тот же список будет сохранён в атрибутах всех объектов этого типа, которые были инстанцированы без указания параметра.
У всесх ваших таких экземплярах внутри ссылка на один и тот же список. Если через одну ссылку в список добавить элеенты, то через другую ссылку доступен тот е самый список с уже добавленными элементами.
Ответ написан
Комментировать
@oleg_ru
Так это работает в питоне. В значение по умолчанию нельзя указывать изменяемый тип. Он создается один раз как поле функции, и при каждом вызовое функции будет этот один и тот же объект.
можно делать так:

def __init__(self, elements=None):
        self.elements = elements or list()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы