对象如何引用自身?

How the object refers to itself?

def create_cycle(): 

    # create a list x 

    x = []

    # A reference cycle is created 

    # here as x contains a reference to 

    # to self. 

    x.append(x) 


create_cycle() 

Because create_cycle() creates an object x which refers to itself, the object x will not automatically be freed when the function returns. This will cause the memory that x is using to be held onto until the Python garbage collector is invoked.

有人可以解释一下对象是如何引用自身的吗?请详细说明上面post说的是什么

当您将对象(例如列表)分配给变量时,不会复制该对象,而是为该对象创建一个 引用。你可以把它想象成一个指针。例如:

a = []
b = a

这将创建一个空列表,并将对该列表的引用分配给 a。以下赋值创建了对 b 中列表的第二个引用。如果您更改列表,例如a.append(5),列表变为 [5]。由于 ab 都引用了列表,因此它们具有相同的值。

引用也可以来自对象内部,例如列表。例如:

a = []
b = [a]

这将创建两个列表。第一个是一个空列表,其中包含 a 对它的引用。第二个是包含单个元素的列表,这是对 a 的第二个引用。如果您再次执行 a.append(5),则第一个列表变为 [5],第二个变为 [[5]]

现在假设您改为执行以下操作:

a = []
a.append(a)

第一个语句再次创建一个空列表,由 a 引用。然后,第二个通过向其附加一个值来修改该列表。但在这种情况下,它不是附加数字或对不同列表的引用,而是附加对列表本身的引用。所以列表最终包含一个元素,它是对列表本身的引用。这是一个循环引用。如果您尝试打印 a,它只会越来越深入地追逐引用,没有尽头,但是 Python 检测到循环并仅显示 ... 来指示循环。

周期影响 Python 中的垃圾回收。 Python 保留每个对象的引用计数。每次创建对对象的新引用时,都会增加该对象的引用计数。当引用被移除时(例如,通过为引用对象的变量分配不同的值,或者通过变量超出范围),引用计数会减少。当它达到零时,Python 知道它可以免费收集(即释放)该对象。这样做时,它引用的任何对象的引用计数也会减少。通常,可以通过这种方式释放整个引用树。

但如果参考图不是树,即如果它包含一个循环,则这不起作用。例如,您可能会以一个相互引用的对象循环结束,每个对象的引用计数为 1。要处理这种情况,需要标记并清除垃圾收集过程。这将遍历所有引用以查看哪些是可达的。然后它会释放任何无法访问的内容,即使它的引用计数不为零。