次のようなものがあるとします。
x = "something"
b = x
l = [b]
x など、参照が 1 つしかないオブジェクトを削除するにはどうすればよいでしょうか。
del x
うまくいきません。たとえば、オブジェクトは引き続き b から到達可能です。
次のようなものがあるとします。
x = "something"
b = x
l = [b]
x など、参照が 1 つしかないオブジェクトを削除するにはどうすればよいでしょうか。
del x
うまくいきません。たとえば、オブジェクトは引き続き b から到達可能です。
ダメダメダメ。Python には、領域の問題が非常に強いガベージ コレクターがあります。オブジェクトの作成やオブジェクトの削除を台無しにすることはありません。
簡単に言えば、それは不可能であり、正当な理由があります。
たとえば、参照を保持するが、誰も使用していないデータのガベージ コレクションを妨げてはならないキャッシュ アルゴリズムが必要な場合は、 を参照してくださいweakref
。
私が今見ている唯一の解決策は、あなたが への唯一の参照を保持していることを確認することです. モジュールには弱参照が実装されており、次のように使用できます。x
x
x
weakref
>>> import weakref
>>> class TestClass(object):
... def bark(self):
... print "woof!"
... def __del__(self):
... print "destructor called"
...
>>> x = TestClass()
>>> b = weakref.proxy(x)
>>> b
<weakproxy at 0x7fa44dbddd08; to TestClass at 0x7fa44f9093d0>
>>> b.bark()
woof!
>>> del x
destructor called
>>> b.bark()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ReferenceError: weakly-referenced object no longer exists
ただし、すべてのクラスを弱参照できるわけではないことに注意してください。特に、ほとんどの組み込み型はできません。一部の組み込み型は、サブクラス化すると弱参照できますが ( などdict
)、そうでないものもあります ( などint
)。
あなたはそうしない。それが要点です。l
あなたの管理外のライブラリにあると想像してください。コレクション要素が消えないことを期待するのは当然です。
また、そうでない場合を想像してください。SO「他のユーザーが自分のオブジェクトを削除できないようにするにはどうすればよいですか?」について質問があります。言語設計者として、両方の要求を満たすことはできません。