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

Python 如何删除存储在多个列表中的对象,python,Python,声明了七个类实例。将为其中三个指定相同的参数值(存储在self.myListattribute中)。 所有七个实例都存储在inst_listA中。其中一半存储在列表B中 现在,我迭代list_B,查看是否有任何实例要删除(在本例中,我要删除存储相同值的三个实例)。一旦我找到这样一个实例,我就会应用del期望从两个列表中删除已删除的实例:inst_listA和inst_listB。但这显然没有发生。 问题:如何从列表中删除变量(对象实例),以便在代码中每隔一次从任何事件中永久删除它们 class

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

现在,我迭代
list_B
,查看是否有任何实例要删除(在本例中,我要删除存储相同值的三个实例)。一旦我找到这样一个实例,我就会应用
del
期望从两个列表中删除已删除的实例:
inst_listA
inst_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

del
语句实际上并不删除对象,它只是删除一个名称。因此,当您这样做时:

for inst in inst_listB:
    if inst.getList()==[6,7,8, None]:
        del inst
        print 'instance deleted'
…您只是在删除本地名称
inst
。对象的任何其他名称,如
inst\u 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。

inst_listB.remove(inst)
@padraiccnningham:从一个列表中删除一个副本。他想从所有列表中删除所有副本。(另外,在迭代列表时从列表中删除值是非法的。)作为补充说明,您不需要费力地建立列表;只需执行
inst_listB=[inst2,inst3,inst3_1,inst3_2,inst4]
@abarnert,只有两个lists@PadraicCunningham:和?其中一个值有6份副本(每个值有2份参考文献,3份副本)。删除其中一个并不是删除6。我希望我不必清理指向相同数据的其他变量。@Sputnix:在大多数现实的程序中,有更好的解决方案,但对于泛型
inst_listA
-类型的玩具示例,确实没有好的方法来建议任何事情。inst怎么会等于
[6,7,8,无]
在您的计算机上是否有
\uu main\uuu.MyClass对象at==[6,7,8,无]
?@padraiccningham:对不起,那应该是
MyClass([6,7,8,无])
。我会修复它。那么
inst=[6,7,8,无]
是真的吗?