列表中的最后一个对象在删除后不会被删除。什么时候有效删除?
Last object in a list isn't deleted after deleting it. When is it effectively deleted?
下面的代码应该删除每个 n
人类对象,然后打印最后一行,但它只删除了其中的 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)]
下面的代码应该删除每个 n
人类对象,然后打印最后一行,但它只删除了其中的 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)]