python list.append () проблема при хранении объектов класса - PullRequest
0 голосов
/ 29 апреля 2020

У меня проблема, когда некоторые объекты класса будут добавлены в список в процессе oop. скажем, у меня есть база данных [ 'kid' , 'parent' , 'grandfather' ] со многими записями. У меня есть класс:

class Person:
     name
     children
     grandchildren

Я делаю все oop (я знаю, что это плохая идея и я могу просто использовать запросы) и ищу каждый grandfather. экземпляр класса хранит данные каждого grandfather и в конце добавляется в список с именем Persons_List. Вот код:

p = Person()
Persons_List = list()
pr = "" #parents
gr = "" #grandfather
for i in my_database.objects.all().order_by('grandfather'):
     if gr != i.grandfather:
        gr = i.grandfather
        pr = i.parent
        if p.name !="":
            Persons_List.append(p) # [:] raises Error and deepcopy not working
            p.name = ""
            p.parents.clear()
            p.grandchildren.clear()
        p.name = i.grandfather
        p.children.append(i.parent)
        p.grandchildren.append(i.kid)
     else:
        if pr != i.parent:
           pr = i.parent
           try:
               p.children.remove(pr)
           except: None
           p.children.append(pr)
           p.grandchildren.append(i.kid)
Persons_List.append(p)  #Adds The Last p To The List     

проблема в том, что в конце данные, хранящиеся в списке, неверны и запутаны. имя последнее p.name. и children и grandchildren не правы.

1 Ответ

1 голос
/ 29 апреля 2020

Первый: у вас отсутствует отступ в Persons_List.append(p). В настоящее время вы добавляете p к списку за пределами вашего for-l oop.

Другой момент может заключаться в том, что вы переопределяете свой p объект снова и снова в вашем l oop.

Это потому, что вы создаете p = Person() вне вашего for-l oop и внутри него вы меняете ссылочный объект.

Если вы создаете новый объект внутри вашего for-l oop, это должно работать. Пример:

list = []
for i in queryset:
    p = Person()
    # do stuff
    list.append(p)

print(list)  # your finished list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...