首页 > 解决方案 > python list.append() 存储类对象时的问题

问题描述

当某些类对象将在循环过程中添加到列表中时,我遇到了问题。假设我有一个[ 'kid' , 'parent' , 'grandfather' ]包含许多记录的数据库。我有一堂课:

class Person:
     name
     children
     grandchildren

我做了一个循环(我知道这是一个坏主意,我可以简单地使用查询)并查找每个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

标签: pythondjangolistclassmodel

解决方案


首先:您在 . 处缺少缩进Persons_List.append(p)。您当前正在附加p到 for 循环之外的列表。

另一点可能是您p在循环中一遍又一遍地覆盖您的对象。

那是因为您p = Person()在 for 循环之外创建并在其中更改引用的对象。

如果您在 for 循环中创建一个新对象,它应该可以工作。例子:

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

print(list)  # your finished list

推荐阅读