2

リンクテキスト

参照カウントの概念を理解しました

したがって、「del astrd」を実行すると、参照カウントがゼロになり、astrd が gc によって収集されますか?

これはサンプル コードです。昨日の質問の後に開発したこれらのコード:リンク テキスト

one.py:

デフォルト abc():

print "Hello"
print "123"
print '345'

2.py:

import one
#reload(one)

#def defg():

one.abc()

three.py:

import os,sys,gc
from time import sleep

import two
#reload(two)
#two.defg()

sleep(20)


directory = os.listdir('.')

for filename in directory:

        if filename[-3:] == 'pyc':

                print '- ' + filename

                print sys.getrefcount(filename)

                file_name = os.path.splitext (filename)[0]

                del file_name   # remove the local reference

                del sys.modules[os.path.splitext (filename)[0]] # removes import

                gc.collect()    # garbage collect

                #del sys.modules[filename]

                #del filename

                #os.remove(filename)

私が three.py で行ったことは正しいですか? 不要な手順はありますか?はいの場合、その理由は?

これから私を助けてください。

4

3 に答える 3

8

refcount がゼロになった瞬間に、メモリは自動的に解放されると思います。GC は関与しません。

Python GC はオプションであり、参照サイクルを持つ到達不能オブジェクトがある場合にのみ使用されます。gc.disable()実際、プログラムが参照サイクルを作成しないことが確実な場合は、呼び出すことができます。

元の質問について:

  • を実行del astrdすると、ローカル名前空間からオブジェクトへの参照 (astrd が参照するものは何でも) のバインドが削除されます。
  • これが refcount が 0 であることを意味する場合、オブジェクトが使用していたメモリは解放されます。
  • したがってdel、オブジェクトは削除されず、参照のバインドが解除されます。オブジェクトの削除は、参照のバインドを解除することで refcount がゼロになる場合に発生する副作用です。

上記は CPython にのみ当てはまることに注意してください。Jython と IronPython は JVM/CLR GC メカニズムを使用し、refcounting をまったく使用していないと思います。

ハンディgc.get_objectsは、Python インタープリターによって追跡されたすべてのオブジェクト インスタンスのリストを返します。例:

インポートGC

クラス テスト (オブジェクト):
    合格

def number_of_test_instances():
    return len([gc.get_objects() の obj の obj if isinstance(obj, test)])

範囲内の i の場合 (100):
    t = テスト()

print "100 のインスタンスを作成して破棄しました。現在あります", \
    number_of_test_instances(), \
    「python インタープリターに認識されているインスタンス。」

# 通常の操作では、GC は
# 到達不能オブジェクトを検出して開始
#すぐに回収
gc.disable()

範囲内の i の場合 (100):
    t = テスト()
    tt = t

print "循環参照で 100 個のインスタンスを作成および破棄しました。現在はあります", \
    number_of_test_instances(), \
    「python インタープリターに認識されているインスタンス。」

gc.collect()
print "手動で gc.collect() を行ったところ、今はあります", \
    number_of_test_instances(), \
    「python インタープリターに認識されているインスタンス。」

このプログラムを実行すると、次のようになります。

100 個のインスタンスを作成して放棄し、現在 1 個のインスタンスが Python インタープリターに認識されています。
循環参照を使用して 100 個のインスタンスを作成および破棄しました。現在、100 個のインスタンスが Python インタープリターに認識されています。
gc.collect() を手動で実行した後、Python インタープリターに認識されるインスタンスが 1 つになりました。
于 2009-04-17T10:50:02.147 に答える
1

次回の GC コレクション実行時に収集される可能性があります。

参照: http://docs.python.org/library/gc.html

于 2009-04-17T10:32:41.563 に答える