说到垃圾回收,其实这玩意在我们使用python中一直伴随左右,只不过通常我们都无感知而已。
python有着垃圾自动回收机制,没啥难的,只不过在面试的时候,可能会被面试官问到,且记录一番。
既然是垃圾,那自然是无用的东西了。大家都知道,在python中,一切皆为对象。那么,那些没有被引用的对象,就是垃圾。
如果垃圾不回收的话,那么会一直在我们的内存中。当垃圾越来越多,程序运行性能也就越来越差。所以,我们要及时的回收垃圾,所谓垃圾的回收,就是将垃圾对象从内存中删除。
在python中,它会自动将没有被引用的对象删除,所以我们也不需要手动去处理。下面我们用代码来辅助说明一下,加深理解记忆。
1.对象被正常引用,所以不是垃圾
class Demo():def __init__(self):self.name = "垃圾回收演示"def __del__(self):""" 特殊方法,在对象被垃圾回收之前调用"""print("Demo()对象被删除", self)a = Demo()print(a.name)input("回车退出程序...")
这里的代码呈现的就是一个常见的引用关系,此时Demo()被a引用,所以它并不是垃圾。至于特殊方法在运行程序时,自然也不会调用。
# 运行结果:垃圾回收演示回车退出程序...
2.对象没有被引用,被垃圾回收
修改代码,将
a=None
,这时候Demo()对象就没有被引用了,所以就成了垃圾,运行的时候可以看到
__del__()
的调用。
class Demo():def __init__(self):self.name = "垃圾回收演示"def __del__(self):""" 特殊方法,在对象被垃圾回收之前调用"""print("Demo()对象被删除", self)a = Demo()print(a.name)a = None # 这时候Demo()对象就没有被引用了,所以就成了垃圾input("回车退出程序...")
运行一下:
垃圾回收演示Demo()对象被删除 <__main__.Demo object at 0x000002A6D9AEB0B8>回车退出程序...
3.两个变量都在引用,只删掉其中一个
继续修改代码,增加一行
b = a
,也就是说,现在变量a和变量b都在引用对象Demo()。虽然a = None,但是b仍然在引用,所以这时候Demo()对象不是垃圾。
class Demo():def __init__(self):self.name = "垃圾回收演示"def __del__(self):""" 特殊方法,在对象被垃圾回收之前调用"""print("Demo()对象被删除", self)a = Demo()print(a.name)b = a # 增加 另一个引用a = Noneinput("回车退出程序...")
运行结果:
垃圾回收演示回车退出程序...
4.程序退出,python自动垃圾回收
最后,当我们继续敲击回车键的时候,会看到Demo()对象被删除。
垃圾回收演示回车退出程序...Demo()对象被删除 <__main__.Demo object at 0x000001ED56D19630>
这是因为,在我运行这个程序的时候,没敲回车键之前,程序一直都在持续运行中,里面的对象在被引用。当敲击回车键后,程序运行也就是结束了,那么程序里的对象也就没用了,所以python会自动回收掉。