【问题标题】:python list.append() problem when storing class objectspython list.append() 存储类对象时的问题
【发布时间】:2020-08-13 06:46:44
【问题描述】:

当某些类对象将在循环过程中添加到列表中时,我遇到了问题。 假设我有一个包含许多记录的数据库[ '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.namechildrengrandchildren 是错误的。

【问题讨论】:

    标签: python django list class model


    【解决方案1】:

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

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

    这是因为您在 for 循环之外创建了 p = Person(),而在循环内部您正在更改引用的对象。

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

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

    【讨论】:

    • 尊敬的先生。谢谢您的回复。最后的 Persons_List.append(p) 不在循环中。此代码将最后一个 p 添加到列表中。只有最后一个。我也尝试过 p = person() 而不是 if 正文中 Person_List.append(p) 行下的那三行。结果是一样的。如果您在循环中间添加一些代码来打印 p 和 Persons_List 中的项目。您会看到 p 效果很好。但该列表有奇怪的行为。无论如何感谢您的回复
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多