Как добавить объекты пользовательского класса в список объектов

Я пытаюсь добавить объекты в список объектов, но все атрибуты класса объекта совпадают с последней записью

Я узнал, что объявление объекта в моем цикле for решает проблему, но не понимаю, почему... (Похоже, что все объекты в списке ссылаются на один и тот же объект)

Сначала я заявляю:

class SimpleClass:
    name = ""
simplelist = []

это работает:

for count in range(4):
    x = SimpleClass()
    x.name = count
    simplelist.append(x)

это не работает (все значения в "simplelist[].name" равны 3) - ПОЧЕМУ?

x = SimpleClass()
for count in range(4):    
    x.name = count
    simplelist.append(x)

потому что вы используете один и тот же объект. Переместите инициализацию x внутрь цикла for.

vb_rises 22.05.2019 14:58

В своем последнем редактировании вы даже отвечаете на свой вопрос. Так какой именно является твой вопрос?

Sayse 22.05.2019 15:01

Чтение nedbatchelder.com/text/names.html

chepner 22.05.2019 15:04
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
4
3
332
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

x = SimpleClass() создает экземпляр класса (что-то вроде объекта такого типа).

Если вы запустите его вне цикла, у вас будет ровно один объект, и вы попытаетесь его изменить. simplelist.append(x) в этом случае добавит этот уникальный объект в список (и будет изменять его каждый раз), поэтому у вас будет список, содержащий много копий одного объекта.

Если вы запустите его внутри цикла, у вас будет несколько различных объектов, создающих экземпляр одного класса. simplelist.append(x) в этом случае каждый новый объект будет добавлен в список, поэтому у вас будет список, содержащий множество разных объектов.

Из официальных документов Python:

Class instantiation uses function notation. Just pretend that the class object is a parameterless function that returns a new instance of the class. For example (assuming the above class):

x = MyClass()

creates a new instance of the class and assigns this object to the local variable x.

The instantiation operation (“calling” a class object) creates an empty object. Many classes like to create objects with instances customized to a specific initial state.

Итак, .добавить() не создает объект и не копирует в него, а просто связывает объекты, которые я создал?

Idnv 22.05.2019 15:29

Во втором случае вы создаете только один объект класса. Затем вы изменяете этот объект и тем самым все уже существующие копии объекта в списке.

Это потому, что вы создаете только один объект и добавляете его в свой список 4 раза. Все объекты (таким образом, в 4 раза одинаковые) будут иметь то же значение, что и имя, и это будет 3, так как это последняя модификация, которую вы сделали в loop.

В вашем случае x является экземпляром класса SimpleClass. На самом деле это ссылка/указатель, и он не изменяется в вашем цикле for. Вы только меняете значение атрибута name класса SimpleClass. Таким образом, ваш список будет содержать одну и ту же ссылку 3 раза.

Другие вопросы по теме