2012-12-03 50 views
2

我想弄清楚什么时候python对象是垃圾收集的候选人。我已经阅读了一些文件/帖子,一直未能找到明确的答案。什么时候python对象是垃圾收集的候选对象?

举例如下一行。这是foo的最后一个参考。 foo指向的对象何时可用于垃圾收集?

ret = func(['xyz: ' + foo.name]) 

断裂下来的(可能的)各个步骤:创建

  1. 临时参考名称。
  2. 'xyz:'与名称和值连接返回。
  3. 列表是使用新字符串创建的。
  4. 函数被调用新数组。
  5. 函数返回。
  6. 结果被分配给ret。
  7. 下一个指令......

之间其中在物先资格被收集两步?对象的引用计数何时递减?

如果步骤列表不完整/不正确,请让我知道。我只是试图列举它们给出可能的参考答案的共同起点。

+1

这里没有阵列。有一个列表。 –

+1

您可能会发现这个PyCon讲话很有用 - 他谈论了PyCon垃圾回收模型以及如何调试和分析Python的内容:http://www.youtube.com/watch?v=6jD34p8PokU –

+0

谢谢@RachelSanders!本视频将回答这个问题。如果你想提供答案,我会标记它。这里是特定时间的链接。 http://www.youtube.com/watch?feature=player_detailpage&v=6jD34p8PokU#t=1020s – Dillon

回答

1

变量会尽快把它的所有引用超出范围或被手动删除(del x)有资格进行垃圾回收。

在您的示例中,foo必须存在于此行之前(否则它是NameError),因此将永远不会在您的示例代码块中进行垃圾回收,因为在此之后引用仍然存在。即使有人在此之后调用del foo,我们也不得不假定没有其他地方的对象被引用来收集垃圾。

+0

可以显示一个对象有资格进行垃圾回收(或不回收),而不会对任何特定的垃圾回收器进行任何说明或是否会实际收集垃圾回收器。 – delnan

+0

@delnan好点,编辑。 –

+0

我问这个问题的原因是因为我看到在第7步之前收集了对象(__del __()被调用)。这是相当意想不到的,这就是为什么我质疑它何时首次有资格收集。 要清楚,我不在乎何时实际收集,而是何时首先是候选人。 – Dillon

5

与其他垃圾收集语言一样,经验法则是:无法访问时。这意味着,只要程序(它的任何部分)仍然可以访问它,就不能使用它。之后,这是公平的比赛。当(甚至是否实际上是回收完全是由实施。

在你的榜样,名称foo保持对象活着,因为程序仍然可以使用它在后面的语句。 (理论上,一个实现可能会检测到一个变量是否不再被使用,并删除该引用 - 可能会使对象无法及时更新。实际上,这在Python中是不可能的,除了可能由JIT编译器编译的一些痕迹。)列表,相反,如果func未在某些可到达的位置(例如,可到达对象的属性或全局变量)中存储对它的引用,则执行func或甚至在此期间可能变得无法访问。

你混淆了 foo,它指的是物体,推理垃圾收集时,这是致命的

注意。没有对象foo,只有一个对象foo在给定的时间点(以及它在不同时间点引用的一组对象)引用。这一点很重要:

  • foo可以改变为指向另一个对象,并将它原指有可能成为不可达的对象。除非你区分这两种情况,否则你不能谈论这种情况。
  • 对象foo可能有许多其他参考指向(实际上很可能)。有可能在foo超出范围之后很长时间保持对象存活,被送入del或更改为引用另一个对象。
+0

你是对的,澄清的foo是对所讨论对象的引用。 – Dillon