Python:如何“销毁”一个类实例/对象?

42
我希望Roach类在达到一定的“饥饿”程度时可以“死亡”,但我不知道如何删除该实例。 我可能在使用术语方面犯了错误,但我的意思是我有很多“蟑螂”在窗户上,我希望特定的蟑螂完全消失。我不能展示代码,因为它非常长。 我将Roach类附加到Mastermind类的蟑螂种群列表中。

9
这段文字需要翻译成英文,原文的意思是“del <instance>”,可以尝试将其翻译成“删除 <实例>”或者“移除 <实例>”。 - TerryA
3个回答

25

总体而言:

  • 每个绑定变量 -> 对象都会增加内部对象的引用计数
  • 有几种通常的方法来减少引用(解除对象 -> 变量绑定):

    1. 退出声明变量的代码块(第一次使用)
    2. 销毁对象将释放所有属性/方法变量 -> 对象引用的引用
    3. 调用del variable也会删除当前上下文中的引用
  • 当一个对象的所有引用都被删除后(counter == 0),它成为垃圾收集的良好候选对象,但不能保证它会被处理 (参考资料在此):

CPython目前使用引用计数方案与(可选的)延迟检测循环链接垃圾收集,它会在大多数对象变得不可达时立即收集它们,但不能保证收集包含循环引用的垃圾。请参阅gc模块的文档以获取有关控制循环垃圾收集的信息。其他实现行为不同,CPython可能会更改。不要依赖于对象在不可达时的立即终止(例如:始终关闭文件)。

  • 一些不可变对象(如字符串)的处理方式与众不同 - 例如,如果两个变量包含相同的字符串,它们可能引用同一个对象,但有些不是 - 请参阅识别对象,为什么id(...)返回值会改变?

  • 对象的id可以通过内置函数id找到

  • 模块memory_profiler看起来很有趣 - 用于监视Python程序的内存使用情况的模块

  • 有许多有用的资源可供学习,例如:在Python中查找对象的所有引用


  • 13

    您无法强制删除Python对象;只有在没有引用它的情况下(或者仅在循环中被循环中的项引用时)才会被删除。您需要告诉您的"Mastermind"来擦除它的引用。

    del somemastermind.roaches[n]
    

    1
    for i,roach in enumerate(roachpopulation_list)
            if roach.hunger == 100
                del roachpopulation_list[i]
                break
    

    从您的种群列表中删除实例(包含所有蟑螂实例)以移除它。
    如果您的蟑螂是在Pygame中创建的Sprites,则使用.kill命令即可删除该实例。

    你能否不进行编号,直接使用 roachpopulation_list.remove(roach),然后再使用 del roach?在我看来,这两种方法应该是等价的,但我不确定。 - Jo Mo
    你可以使用Python中的任何函数来从列表中删除实例,例如delete、remove、pop等。一旦一个实例不再存储在列表、字典、变量等中,它就被遗忘了。 - Beatrix Kidco

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接