包虫病

注册

 

发新话题 回复该主题

python垃圾自动回收 [复制链接]

1#

说到垃圾回收,其实这玩意在我们使用python中一直伴随左右,只不过通常我们都无感知而已。

python有着垃圾自动回收机制,没啥难的,只不过在面试的时候,可能会被面试官问到,且记录一番。

既然是垃圾,那自然是无用的东西了。大家都知道,在python中,一切皆为对象。那么,那些没有被引用的对象,就是垃圾。

如果垃圾不回收的话,那么会一直在我们的内存中。当垃圾越来越多,程序运行性能也就越来越差。所以,我们要及时的回收垃圾,所谓垃圾的回收,就是将垃圾对象从内存中删除。

在python中,它会自动将没有被引用的对象删除,所以我们也不需要手动去处理。下面我们用代码来辅助说明一下,加深理解记忆。

1.对象被正常引用,所以不是垃圾

classDemo()ef__init__(self):self.name="垃圾回收演示"def__del__(self):"""特殊方法,在对象被垃圾回收之前调用"""print("Demo()对象被删除",self)a=Demo()print(a.name)input("回车退出程序...")

这里的代码呈现的就是一个常见的引用关系,此时Demo()被a引用,所以它并不是垃圾。至于特殊方法在运行程序时,自然也不会调用。

#运行结果:垃圾回收演示回车退出程序...2.对象没有被引用,被垃圾回收

修改代码,将a=None,这时候Demo()对象就没有被引用了,所以就成了垃圾,运行的时候可以看到__del__()的调用。

classDemo()ef__init__(self):self.name="垃圾回收演示"def__del__(self):"""特殊方法,在对象被垃圾回收之前调用"""print("Demo()对象被删除",self)a=Demo()print(a.name)a=None#这时候Demo()对象就没有被引用了,所以就成了垃圾input("回车退出程序...")

运行一下:

垃圾回收演示Demo()对象被删除__main__.Demoobjectat0xA6D9AEB0B8回车退出程序...3.两个变量都在引用,只删掉其中一个

继续修改代码,增加一行b=a,也就是说,现在变量a和变量b都在引用对象Demo()。虽然a=None,但是b仍然在引用,所以这时候Demo()对象不是垃圾。

classDemo()ef__init__(self):self.name="垃圾回收演示"def__del__(self):"""特殊方法,在对象被垃圾回收之前调用"""print("Demo()对象被删除",self)a=Demo()print(a.name)b=a#增加另一个引用a=Noneinput("回车退出程序...")

运行结果:

垃圾回收演示回车退出程序...4.程序退出,python自动垃圾回收

最后,当我们继续敲击回车键的时候,会看到Demo()对象被删除。

垃圾回收演示回车退出程序...Demo()对象被删除__main__.Demoobjectat0xED56D

这是因为,在我运行这个程序的时候,没敲回车键之前,程序一直都在持续运行中,里面的对象在被引用。当敲击回车键后,程序运行也就是结束了,那么程序里的对象也就没用了,所以python会自动回收掉。

把苹果咬哭

分享 转发
TOP
发新话题 回复该主题