gpt4 book ai didi

python - 列表中的最后一个对象在删除后不会被删除。什么时候有效删除?

转载 作者:行者123 更新时间:2023-12-05 09:09:43 24 4
gpt4 key购买 nike

下面的代码应该删除每个 n Human 对象,然后打印最后一行,但它只删除了其中的 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

在第 2 个 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)]

关于python - 列表中的最后一个对象在删除后不会被删除。什么时候有效删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62162543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com