列表中的最后一个对象在删除后不会被删除。何时有效删除?



以下代码应该删除每个nHuman 对象,然后打印最后一行,但它只删除其中的 4 个,第 5 个在执行停止后被删除(我认为(。

class Human():
def __init__(self, name):
self.name = name
def __del__(self):
print(f'{self.name} is dead')

n = 5
humans = []
for i in range(n):
human = Human('Bob')
humans.append(human)
for i in reversed(range(n)):
del humans[i]
print('DEATH')

输出如下(Powershell和Python 3.8.1(:

Bob is dead  
Bob is dead  
Bob is dead  
Bob is dead  
DEATH  
Bob is dead

在第二个 for 循环之后,humans为空,因此无法按del humans[0]删除最后一项。删除列表内容(del humans[:]humans.clear(的其他方法也不能解决问题,输出保持不变。

那么,这是代码的行为方式还是存在一些问题?

其中一个对象没有被垃圾回收,因为仍然有对它的引用:

class Human():
def __init__(self, name):
self.name = name
def __del__(self):
print(f'{self.name} is dead')

n = 5
humans = []
for i in range(n):
human = Human(f'Bob {i}')
humans.append(human)
for i in reversed(range(n)):
print(f'Die, {humans[i].name}!')
del humans[i]
print('DEATH')
print(f"(except for {human.name} whom we haven't forgotten about!)")

如果你想避免这种悬而未决的引用,一个简单的解决方法是首先不要创建它:

n = 5
humans = []
for i in range(n):
humans.append(Human(f'Bob {i}'))

或者更好的是:

n = 5
humans = [Human(f'Bob {i}') for i in range(n)]

最新更新