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

时间:2014-08-15 00:26:39

标签: 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

1 个答案:

答案 0 :(得分:2)

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

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

...您只是删除了本地名称inst。该对象的任何其他名称(如inst_listB[1])仍然存在。没有办法同时消除值的所有名称,因为该值不知道人们给出的所有名称。

想想这在现实生活中会如何发挥作用:我拿起电话簿查看Sputnix,然后撕下你正在使用的页面。没有办法可以影响这个城市的其他电话簿。即使我可以删除你的价值,比如说,在夜总会追踪你并射击你(假设Kyle Reese不在那里阻止我) - 那仍然不会让你从所有这些电话簿中删除,这只是意味着没有人可以使用这些电话簿给你打电话。*

无论如何,您想要做的就是从两个列表中删除[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中的文字等价物是将弱引用放入列表中。这确保了只有一个真正的引用,当你杀了它时,弱引用仍然存在,但没有任何东西可以参考 - 就像电话簿条目为一个死人。但你还不想了解弱点。