PEP 442,具有__del __()方法的对象不再以gc.garbage结尾

时间:2017-10-29 05:49:20

标签: python garbage-collection

收集带有__del__方法的

循环。 (PEP 442)。
但为什么我得到了python2.7和pyton3.6的相同结果呢? a,b,foo,bar已被释放?

import gc
import sys


class Foo(object):
    def __init__(self):
        self.bar = None
        print('foo init')

    def __del__(self):
        print("foo del")


class Bar(object):
    def __init__(self):
        self.foo = None
        print('bar init')

    def __del__(self):
        print('bar del')


def collect_and_show_garbage():
    print("Collecting...")
    n = gc.collect()
    print("unreachable objects:", n)


def func():
    foo = Foo()
    bar = Bar()
    foo.bar = bar
    bar.foo = foo


def func2():
    a = [1, 2]
    b = [3, 4]
    a.append(b)
    b.append(a)


func()
func2()
collect_and_show_garbage()
  

foo init
  bar init
  收集...
  foo del
  酒吧德尔   无法到达的物体:6

当我删除__del__方法时,我得到了相同的结果

import gc
import sys


class Foo(object):
    def __init__(self):
        self.bar = None
        print('foo init')


class Bar(object):
    def __init__(self):
        self.foo = None
        print('bar init')



def collect_and_show_garbage():
    print("Collecting...")
    n = gc.collect()
    print("unreachable objects:", n)


def func():
    foo = Foo()
    bar = Bar()
    foo.bar = bar
    bar.foo = foo


def func2():
    a = [1, 2]
    b = [3, 4]
    a.append(b)
    b.append(a)


func()
func2()
collect_and_show_garbage()
  

foo init
  bar init
  收集...
  无法到达的物体:6

1 个答案:

答案 0 :(得分:0)

GC.Collect的:

  

返回无法访问的对象数。

gc.garbage:

  

收集器发现无法访问的对象列表   无法释放(无法收集的物品)。

import gc
import sys


class Foo(object):
    def __init__(self):
        self.bar = None
        print('foo init')

    def __del__(self):
        print("foo del")


class Bar(object):
    def __init__(self):
        self.foo = None
        print('bar init')

    def __del__(self):
        print('bar del')


def collect_and_show_garbage():
    print("Collecting...")
    n = gc.collect()
    print("unreachable objects:", n)
    print("uncollectable objects:", gc.garbage)


def func():
    foo = Foo()
    bar = Bar()
    foo.bar = bar
    bar.foo = foo


def func2():
    a = [1, 2]
    b = [3, 4]
    a.append(b)
    b.append(a)


func()
func2()
collect_and_show_garbage()

python2.7

  

foo init
  bar init
  收集...
  ('无法到达的对象:',6)
  (&#39;无法收集的对象:&#39;,[&lt; .Foo对象位于0x10cff55d0&gt;,&lt; main .Bar对象位于0x10cff5650&gt;])< / p>

pyhton3.6

  

foo init
  bar init
  收集...
  foo del
  酒吧德尔   无法到达的物体:6
  无法收集的物品:[]