删除一个Python对象并使其成为非对象

2024-09-28 01:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我的类定义:

class Playingsound:
    def ___init___(self):
        # blah

    def fadeout_and_stop(self):
        # do somthing (fadeout during 100 ms)
        del self

这是我的问题(类似于那个问题:Python object deleting itself):

^{pr2}$

相反,我希望a在调用fadeout_and_stop之后被完全销毁,它的引用是None

>>> a
<None>

如何使用Python实现这一点?在


Tags: andselfnone定义initdefdoclass
3条回答

在python中不能销毁对象。这是垃圾收集者的工作。您可以做的是将引用更改为“无”或删除该引用。但是如果对象仍然有其他的引用链接,它将保持在内存中而不会受到伤害。看看这个例子

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
if __name__=='__main__':
    l1=ListNode(9)
    t=ListNode(8)
    l1.next=t
    l2=ListNode(1)
    s=Solution()
    r=s.addTwoNumbers(l1,l2)
    del t #not similar to t=None, this will fully destroy the existence
          #of the reference t, while t=None will only set the reference 
          #to None
    print l1.next.val #this will give the value 8
    print t #this line will give an error as reference t has no 
            #existence anymore

看,值为8的对象(在t=ListNode(8)行创建)仍然是活动的。我们只销毁了t的引用,但实际对象在python的垃圾回收器手中。只有当我们删除另一个引用链接(l1.next)时,该对象将丢失所有引用链接并成为垃圾,然后python将从内存中完全销毁它。因此,虽然您可以完全控制引用,但无法控制实际对象。在

只需尝试在finish函数中的“delself”语句后打印self,这样做会因为python内存管理而出错。在为类a创建“a”对象之后,此对象“a”将被标记到某个内存位置,当您调用finish()时,您将传递“a”对象的引用。所以当你使用del self时,内存引用将不加标记的对象,但我们的对象仍然是'a'指向那个内存位置。你需要取消标记所有引用才能销毁该对象。在

如果不遍历垃圾收集器中的所有引用,并测试每一个引用是否是对该对象的引用,然后将该引用设置为None。你不想去那里。记住:可以有多个对对象的引用:

a = A()
b = a
a.finish()  # what should be set to `None` now? a, b or both?

不是a.finish(),而是del a,可能与实现^{} clean-up hook相结合。在

如果超时后需要清理对象,请将对象添加到全局列表中,并在播放结束后将其从该列表中删除。列表可以在类本身上:

^{pr2}$

如果没有其他引用实例,Python将负责为您清理:

a = Playingsound()
a.fadeout_and_stop()
del a

您始终可以通过Playingsound.playing访问任何仍在播放的声音。在

相关问题 更多 >

    热门问题