AI智能
改变未来

【python】垃圾自动回收

说到垃圾回收,其实这玩意在我们使用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会自动回收掉。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 【python】垃圾自动回收