Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python垃圾收集器_Python_Garbage Collection - Fatal编程技术网

Python垃圾收集器

Python垃圾收集器,python,garbage-collection,Python,Garbage Collection,给定下面的代码示例,示例1中的bb和示例2中的self.bb的生命周期是什么 例1 import B class A: def __init__( self ): bb = B( self ) 例2 import B class A: def __init__( self ): self.bb = B( self ) 编辑: B是另一个类,出于某种原因,我发现在第一个示例中它不是垃圾收集的。我更仔细地查看了我的代码,发现B类创建了一个新的

给定下面的代码示例,示例1中的
bb
和示例2中的
self.bb
的生命周期是什么

例1

import B

class A:
    def __init__( self ):
        bb = B( self )
例2

import B

class A:

    def __init__( self ):
        self.bb = B( self )
编辑:

B是另一个类,出于某种原因,我发现在第一个示例中它不是垃圾收集的。我更仔细地查看了我的代码,发现B类创建了一个新的C类,并对该C类的一个方法进行了引用。最后,C实例化了一个循环回线程以等待事件,因此即使完成了类初始化,B类实例仍然是活动的


谢谢大家的回答。

在实例化
A
之前,在这两种情况下都不会引用
B
实例


一旦实例化
A
,在第一种情况下,它将在
\uuuu init\uuuu
运行后立即被丢弃,因为
bb
将超出范围,并且将没有对该
B
实例的引用,因此它将在下一个GC循环中被垃圾收集(具体时间是实现细节)。关于第二个案件,只要对
a
实例的引用存在,或者直到您手动删除它,对该
B
实例的引用就会存在。

在第一个示例中
bb
是函数
局部变量
,函数
bb
变量可以在相同的
函数中访问


在第二个示例中,
self.bb
是每个类对象的
实例变量

他们没有生命。你必须继承

Example 1

import B
class A:
    def __init__( self ):
        B.__init__(self)
bb = B()

Example 2

import B
class A:
    def __init__( self ):
        B.__init__(self)

bb = B()

有关

的更多信息,请参见
bb
都没有任何生存期,因为您没有创建A类的实例。
bb
在第一个示例中是本地的;像所有的本地人一样,它在
A.退出时被清除。您的问题相当广泛,在Python文档和其他关于堆栈溢出的地方得到了回答;你自己做过什么研究,还有什么不清楚?在CPython中,对象的引用计数下降到0时,对象就消失了。GC只处理循环引用,这里不适用。因此,对象会立即被捕获,而不是在下一个GC循环中。但是Jython、IronPython和PyPy可以自由地使用不同的策略,并且可以这样做。@MartijnPieters你的这句话救了我一天。谢谢而在Jython,比如说,不能保证垃圾会被收集。