据我所知,Python3不保证何时释放对象的内存,除非至少有一个非弱引用指向对象,它就不会被释放。
该语言是否对弱引用做出了任何其他保证?特别地,假设我创建了一个指向某个对象弱引用wr。假设在以后的某个时间,对该对象的所有非弱引用都已销毁。是否保证在那时wr的计算结果为None,或者在一段时间内它是否仍然计算为原始对象?
除了语言保证,是否有任何有趣的实现行为围绕着弱化?
发布于 2012-03-22 02:44:42
虚弱引用可以给你一个有效的对象(来自Python的POV),或者一个都没有。对象在哪一点被实际释放(导致弱引用变为无)是未定义的,除了不能有任何其他活动对象对该对象的任何非弱引用。不能保证您在CPython中观察到的引用计数行为。
发布于 2012-03-21 07:27:28
弱引用对象只有在GC生效后才会被销毁。因为这是不确定的,所以不能保证一旦所有强引用都被删除,它就会被销毁。
从docs
...when对引用对象的唯一剩余引用是弱引用,垃圾回收可以自由地销毁引用对象,并将其内存重用于其他对象。
有效的短语是“自由地摧毁所指对象”--它可能不会立即发生。
发布于 2012-03-21 07:28:00
不,Python不保证对象何时被实际收集,并且弱引用将返回None。这可以立即发生(在CPython中经常发生,它使用引用计数加上循环引用垃圾收集器,但在其他不使用引用计数的Python实现中很少发生)。由于多种原因,它也会被延迟--不使用CPython (或使用不使用refcounting的CPython版本),或者使用refcounting但对象参与引用循环时。
https://stackoverflow.com/questions/9796492
复制相似问题