15

次のようなものがあるとします。

x = "something"
b = x
l = [b]

x など、参照が 1 つしかないオブジェクトを削除するにはどうすればよいでしょうか。

del xうまくいきません。たとえば、オブジェクトは引き続き b から到達可能です。

4

3 に答える 3

18

ダメダメダメ。Python には、領域の問題が非常に強いガベージ コレクターがあります。オブジェクトの作成やオブジェクトの削除を台無しにすることはありません。

簡単に言えば、それは不可能であり、正当な理由があります。

たとえば、参照を保持するが、誰も使用していないデータのガベージ コレクションを妨げてはならないキャッシュ アルゴリズムが必要な場合は、 を参照してくださいweakref

于 2010-06-10T11:44:15.070 に答える
12

私が今見ている唯一の解決策は、あなたが への唯一の参照を保持していることを確認することです. モジュールには弱参照が実装されており、次のように使用できます。xxxweakref

>>> 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)。

于 2010-06-10T12:54:48.347 に答える
5

あなたはそうしない。それが要点です。lあなたの管理外のライブラリにあると想像してください。コレクション要素が消えないことを期待するのは当然です。

また、そうでない場合を想像してください。SO「他のユーザーが自分のオブジェクトを削除できないようにするにはどうすればよいですか?」について質問があります。言語設計者として、両方の要求を満たすことはできません。

于 2010-06-10T11:40:01.160 に答える