声明了七个类实例。其中三个分配了相同的参数值(存储在self.myList
属性中)。
所有七个实例都存储在inst_listA
中。其中一半存储在list_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
答案 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中的文字等价物是将弱引用放入列表中。这确保了只有一个真正的引用,当你杀了它时,弱引用仍然存在,但没有任何东西可以参考 - 就像电话簿条目为一个死人。但你还不想了解弱点。