【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 = None  

input("回车退出程序...")

运行结果:

垃圾回收演示
回车退出程序...

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

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

垃圾回收演示
回车退出程序...
Demo()对象被删除 <__main__.Demo object at 0x000001ED56D19630>

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

posted @ 2021-04-14 07:29  把苹果咬哭的测试笔记  阅读(162)  评论(0编辑  收藏  举报