如何删除存储在多个列表中的对象

2024-09-28 05:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

声明了七个类实例。为其中三个指定相同的参数值(存储在self.myList属性中)。 所有七个实例都存储在inst_listA中。其中一半存储在list_B

现在我迭代list_B,查看是否有任何实例需要删除(在本例中,我要删除三个存储相同值的实例)。一旦找到这样的实例,我就应用del,希望删除的实例从两个列表中删除:inst_listAinst_listB。但这显然没有发生。 问题:如何从列表中删除变量(对象实例),以便在代码中每隔一次从任何引用中永久删除它们

class MyClass(object):
    def __init__(self, myList):
        super(MyClass, self).__init__()
        self.myList = myList
    def getList(self):
        return self.myList


inst1=MyClass([1,2,3, None])
inst2=MyClass([3,4,5, None])

inst3=MyClass([6,7,8, None])
inst3_1=MyClass([6,7,8, None])
inst3_2=MyClass([6,7,8, None])

inst4=MyClass([9,10,11, None])
inst5=MyClass([12,13,14, None])

inst_listA=[]
inst_listA.append(inst1)
inst_listA.append(inst2)
inst_listA.append(inst3)
inst_listA.append(inst3_1)
inst_listA.append(inst3_2)
inst_listA.append(inst4)
inst_listA.append(inst5)

inst_listB=[]
inst_listB.append(inst2)
inst_listB.append(inst3)
inst_listB.append(inst3_1)
inst_listB.append(inst3_2)
inst_listB.append(inst4)

print inst_listA    
print inst_listB
for inst in inst_listB:
    if inst.getList()==[6,7,8, None]:
        inst_listB.remove(inst)
        del inst
        print 'instance deleted'

print inst_listB
print inst_listA

Tags: 实例selfnonemyclasslistprintdelappend
1条回答
网友
1楼 · 发布于 2024-09-28 05:39:51

del语句实际上并不删除对象,它只是删除一个名称。所以,当你这么做的时候:

for inst in inst_listB:
    if inst.getList()==[6,7,8, None]:
        del inst
        print 'instance deleted'

…您正在删除本地名称inst。对象的任何其他名称,如inst_listB[1],仍然存在。无法同时删除一个值的所有名称,因为该值不知道人们给它的所有名称

想想这在现实生活中是如何工作的:我拿到电话簿,查一下Sputnix,然后撕下你的页面。这不可能影响城市里其他所有的电话簿。即使我可以删除你的价值,比如说,在一家夜总会跟踪你并向你开枪(假设凯尔·里斯不在那里阻止我),这仍然不会把你从所有的电话簿中删除,这只意味着没有人可以再使用这些电话簿给你打电话了。*

无论如何,看起来您要做的是从两个列表中删除[6, 7, 8, None]的所有副本。最简单的方法是直接进行:

inst_listA = [inst for inst in inst_listA if inst.getList() != [6, 7, 8, None]]
inst_listB = [inst for inst in inst_listB if inst.getList() != [6, 7, 8, None]]

*在Python中,这一点的字面等价物是将弱引用放入列表中。这就确保了只有一个真正的参考文献,当你杀死它时,弱的参考文献仍然存在,但是没有什么可以参考的,就像一个死人的电话簿条目一样。但您还不想了解weakrefs。

相关问题 更多 >

    热门问题