2

このコード

import gc
gc.disable()
print gc.isenabled()
print len(gc.get_objects())
class Foo(): pass
print len(gc.get_objects())

a=[]
print len(gc.get_objects())
for i in xrange(10000):
    a.append(Foo())

print len(gc.get_objects())
a=[] # Should not collect
print len(gc.get_objects())
gc.collect()
print len(gc.get_objects())

この出力を生成します

False
3754
3755
3756
13756
3756
3374

最後から 2 番目の数字は 13756 であると予想します。これは、gc が無効になっており、元のaリストが範囲外になったときに、それらのオブジェクトを削除しないためです。とにかくpythonはそれらのオブジェクトを収集しているようです。なんで ?

pythonは2.7.2です

4

1 に答える 1

2

ガベージ コレクションは循環参照のみを処理するためです。gcモジュールのドキュメントから引用:

コレクターは Python で既に使用されている参照カウントを補足するため、プログラムが参照サイクルを作成しないことが確実な場合は、コレクターを無効にすることができます。

CPython は参照カウントを使用して、ほとんどのオブジェクトをクリーンアップします。参照されているリストを空のリストに置き換えると、古いリストの参照カウントが 0 になるため、その時点でa削除されます。リストを削除すると、インスタンスの参照カウントも 0 になります。Foo()

代わりに循環参照を作成し、ガベージ コレクション無効にすると、数値が一定のままであることがわかります。

class Foo(object):
    def __init__(self):
         self.bar = Bar(self)

class Bar(object):
    def __init__(self, foo):
        self.foo = foo
于 2013-07-24T11:28:06.460 に答える