web-dev-qa-db-ja.com

リスト内のすべてのオブジェクトを削除する

多くのオブジェクトを作成し、リストに保存します。しかし、ニュース1を作成し、メモリが高くなりたくないので、しばらくしてからそれらを削除します(私の場合は、削除しないと20ギガバイトのRAMにジャンプします)。

ここに私がやろうとしていることを説明するための小さなコードがあります:

class test:
    def __init__(self):
        self.a = "Hello World"
    def kill(self):
        del self

a = test()
b = test()
c = [a,b]

print("1)Before:",a,b)

for i in c:
    del i

for i in c:
    i.kill()   

print("2)After:",a,b)

AとBは私のオブジェクトです。 Cは、これら2つのオブジェクトのリストです。私はCのforループでそれを確実に削除しようとしています:1回はDELで、もう1回は関数で。印刷物はオブジェクトを表示し続けるため、機能していないようです。

これは、100,000個のオブジェクトを何度も作成するために必要です。最初に100kオブジェクトを作成し、2回目はさらに100kオブジェクトを作成しますが、前の100kオブジェクトを保持する必要はありません。それらを削除しないと、メモリ使用量が非常に速くなります。

30

tl; dr;

_mylist.clear()  # Added in python3.(? maybe 5?)
del mylist[:]
_

おそらくこれを行う最良の方法です。この回答の残りの部分では、他の努力のいくつかがうまくいかなかった理由を説明しようとします。


cpythonは少なくとも参照カウントで動作して、オブジェクトがいつ削除されるかを決定します。ここでは、同じオブジェクトへの複数の参照があります。 aは、_c[0]_が参照する同じオブジェクトを参照します。 c(_for i in c:_)をループすると、ある時点でiも同じオブジェクトを参照します。 delキーワードは単一の参照を削除するため、次のようになります。

_for i in c:
   del i
_

cにオブジェクトへの参照を作成し、その参照を削除しますが、オブジェクトにはまだ他の参照(たとえば、cに保存されている参照)があるため、永続します。

同じやり方で:

_def kill(self):
    del self
_

そのメソッド内のオブジェクトへの参照のみを削除します。リストからすべての参照を削除する1つの方法は、スライスの割り当てを使用することです。

_mylist = list(range(10000))
mylist[:] = []
print(mylist)
_

どうやらスライスを削除して、所定の場所にあるオブジェクトを削除することもできます:

_del mylist[:]  #This will implicitly call the `__delslice__` or `__delitem__` method.
_

これにより、mylistからすべての参照が削除され、mylistを参照するものからも参照が削除されます。それを単純にリストを削除することと比較しました-例えば.

_mylist = list(range(10000))
b = mylist
del mylist
#here we didn't get all the references to the objects we created ...
print(b) #[0, 1, 2, 3, 4, ...]
_

最後に、最近のpythonリビジョンは clear メソッドを追加しました。これは_del mylist[:]_します。

_mylist = [1, 2, 3]
mylist.clear()
print(mylist)
_
44
mgilson

リストからすべてのアイテムを削除する方法は次のとおりです。

del c[:]

リストから最初の2つのアイテムを削除する方法は次のとおりです。

del c[:2]

aがリストであると仮定して、リスト(c)から単一のアイテムを削除する方法は次のとおりです。

del c[0]
29
Jon-Eric

目的がオブジェクトaおよびb自体を削除することである場合(これが当てはまるようです)、リスト_[a, b]_を作成することは役に立ちません。代わりに、それらのオブジェクトの名前として使用される文字列のリストを保持する必要があります。これらにより、globals()辞書にアクセスして、ループ内のオブジェクトを削除できます。

_c = ['a', 'b']
# create and work with a and b    
for i in c:
    del globals()[i]
_
0
user6655984

リスト内のすべてのオブジェクトを削除するには、list = []

以下に例を示します。

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a = []
>>> a
[]
0
trojek