如何将对象交给python垃圾回收?

发布于 2021-01-29 16:49:45

在SO中有几个关于Python垃圾收集的线程,在阅读了大约五个内容之后,加上一些在线文档,我仍然不确定垃圾收集的工作方式以及我应该如何管理未使用的对象。实际上,在我读过的某个地方,一个人不应该做任何关于收集垃圾的事情,其他人则告诉一个应该del对象,而另一些人再次解释说,取消引用对象足以使Python将其作为垃圾收集。

因此,冒着创建重复项的风险,我将再次询问该问题,但以不同的方式,希望获得更全面,更清晰的信息。

以我为例,我想用代表人的对象进行一个小模拟。Person()该类的几个实例将被创建。它应该存在一段时间,直到它实际上“死亡”,同时将创建其他实例。

现在,我如何使该Person()实例“死亡”(假设将创建许多此类实例,并且我不希望这些实例像幽灵一样闲逛)?

我可以通过几种方式引用对象:

john = Person('john')

要么

people = []
people.append(Person('john'))

要么

people = {}
people['john'] = Person('john')

保持程序干净,最佳释放资源的最佳方法是什么?那么引用我的对象的最佳方法是什么,以便我可以控制对象的删除?

关注者
0
被浏览
71
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我发现大多数程序都是很自然地创建和处理对象的,所以我通常不会担心它。

    一些例子:

    person = Person('john')
    person = Person('james')
    # Whoops! 'john' has died!
    
    people = []
    people.append(Person('john'))
    # ...
    # All 'Persons' live in people
    people = []
    # Now all 'Persons' are dead (including the list that referenced them)
    
    class House():
        def setOwner(self, person):
            self.owner = person
    
    house.setOwner(people[0])
    # Now a House refers to a Person
    people = []
    # Now all 'Persons' are dead, except the one that house.owner refers to.
    

    我认为您所追求的是:

    people = {}
    people['john'] = Person('john')
    
    def removePerson(personName):
        del people[personName]
    
    removePerson('john')
    

    在这种情况下,people是主列表,您可以控制何时Person从列表(它的字典)中添加和删除列表。

    您可能必须仔细考虑一个被创建的人的概念,然后彻底死去:一旦创建,这个人将如何与模拟互动。死亡后,如何解开引用?(一个人可以引用其他内容,例如House在我的示例中可以使一个人存活)。您可以让其他对象仅保留该人的名字。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看