Python OOP中合并Army实例后无法删除被合并实例的问题
为什么
__add__里的del other没删掉army2? 这事儿核心在于Python的引用计数机制,我给你拆解明白:
1. Python里「变量」和「实例」的关系
你得先搞懂:像army2这种变量,本质上只是一个指向实例的“标签”(引用),不是实例本身。当你敲army2 = Army(30,5,0)时,其实是先在内存里生成了一个Army实例,然后让army2这个标签“贴”到它身上。
2. __add__里的del other删的是什么?
当你调用army1 + army2时,Python会把army2作为参数传给__add__的other形参——这时候,那个Army实例身上又多了一个临时标签:other(这个标签只在__add__函数里有效)。
你在__add__里写del other,只是把这个局部的other标签撕掉了,但原来的army2标签还好好贴在实例身上呢!只要实例身上还有至少一个标签(引用),Python的垃圾回收机制就不会把它删掉,所以你之后还能访问army2。
3. 手动del army2为什么有效?
手动执行del army2时,你撕掉的是全局的army2标签——如果这时候没有其他标签指向那个实例了(比如__add__里的other已经被删掉),实例身上的引用计数就降到0了,Python才会把它从内存里彻底清理掉。
4. 怎么实现你想要的“合并后删除目标实例”效果?
你没法直接通过del other删掉外部的army2引用,但可以给被合并的实例做个“失效标记”,比如:
class Army: def __init__(self, spear, sword, archer): self.composition = {'spear': spear, 'sword': sword, 'archer': archer} self.is_merged = False # 新增:标记军队是否已被合并 def __add__(self, other): if other.is_merged: raise ValueError("这个军队已经被合并,无法重复操作!") # 合并兵力 for item in other.composition: self.composition[item] += other.composition[item] # 标记目标军队为已合并,并清空内容 other.is_merged = True other.composition.clear()
这样合并后,army2虽然还存在,但已经是个空壳,而且无法被重复合并,也能达到你想要的“被合并的目标实例不再可用”的效果。
内容的提问来源于stack exchange,提问作者mooder
相关产品推荐
相关产品推荐

