2009-05-12 11 views
159

Pythonでリストを消去するときに、これらの2つの行より複雑な何かをする理由はありますか?リストをクリアするさまざまな方法

old_list = [] 
old_list = list() 

私が尋ねる理由は、私はいくつかの実行中のコードでこれを見たということです。

場所にリストをクリア
del old_list[ 0:len(old_list) ] 
+1

なぜこれをやっていますか?ガベージコレクションが動作します。単純に古いリストの値を無視し、Pythonで自動的にそれをクリーンアップしてみましょう。 –

+32

@ S.Lott:ポスターはコードを書いていないので、元の作家がなぜそうしたのかと尋ねています。 –

+14

質問には関係ありませんが、スライスを指定するときはlenを使用しないでください。 'a [:x]'はxから始まることを意味し、 'a [x:]'は終了することを意味します。 'a [0:len(a)]'は 'a [:]'と書くことができます。最後から数えるためにネガを使うこともできます( 'a [-1]'が最後の要素です)。 – idbrii

答えて

303

は同じリストの他のすべての参照に影響します。

例えば、この方法は、他の文献には影響しません:

>>> a = [1, 2, 3] 
>>> b = a 
>>> a = [] 
>>> print(a) 
[] 
>>> print(b) 
[1, 2, 3] 

をしかし、この1の処理が行われます。

>>> a = [1, 2, 3] 
>>> b = a 
>>> del a[:]  # equivalent to del a[0:len(a)] 
>>> print(a) 
[] 
>>> print(b) 
[] 
>>> a is b 
True 

あなたも行うことができます:

>>> a[:] = [] 
+6

うーん、毎日何か新しいことを学ぶ。 –

+80

あなたは 'del a [:]'を実行することもできます – idbrii

+1

なぜ最初のものが 'a'にしか影響しませんか?私は 'a'と' b'の同じオブジェクトへの参照を考えました...なぜか分かりたいです。ありがとう。 – Stallman

11

それが表示されます。デルはあなたに記憶を戻しますが、新しいリストを割り当てると古いものがgc runs.matterが実行されたときにのみ削除されます。

これは大きなリストには役立ちますが、小さなリストの場合は無視してください。

:Algoriasとしては関係ありません。

del old_list[ 0:len(old_list) ] 

は、あなたがリストをクリアする可能性のある2例あり

del old_list[:] 
+2

gcはサイクルで実行されません。リストは、最後の参照が削除されるとすぐに解放されます。 – Algorias

+2

Algorias:それはCPythonに当てはまりますが、他の実装ではないかもしれません。 – mhsmith

+1

del old_list [0:len(old_list)]とdel old_list [:]の結果は同じですが、後者の方が高速です(Python 2.6でチェックされています) –

4

と同等であることを

注:

  1. あなたが名前を使用したいがold_listさらにあなたのコードで。
  2. メモリを解放するために古いリストをできるだけ早くガベージコレクションする必要があります。ケース1では

あなただけassigmentに行く:

old_list = [] # or whatever you want it to be equal to 

ケース2ではdel文はで名前をリストオブジェクトにold listポイントを参照カウントを減少させるであろう。リストオブジェクトの名前がold_list atである場合、参照カウントは0になり、オブジェクトはガベージコレクションのために解放されます。

del old_list 
30

非常に簡単な方法でpythonリストを削除できます。 del list_name [:]を使用してください。例えば

>>> a = [1, 2, 3]` 
>>> b = a 
>>> del a[:] 
>>> print a, b 
[] [] 
3
del list[:] 

は、リストをクリアしている場合、そのリストの変数の値

del list 

はメモリ

1

から変数自体を削除します削除します明らかにリストはもう必要ありません。その場合は、単純なdelメソッドでリスト全体を削除することができます。

a = [1, 3, 5, 6] 
del a # This will entirely delete a(the list). 

ただし、もう一度必要な場合は、再初期化することができます。それとも、単に

del a[:] 
-1

によって参照空のリストとして空のリストを作成することで正常に動作し、別のソリューションをその要素をクリアします。

empt_list = [] 

たとえば、a_list = [1,2,3]というようなリストがあります。以下を行うだけで、それをクリアするには:

a_list = list(empt_list) 

をこれはちょうどempt_listようa_list空のリストを作成します。 Pythonでインプレースリストをクリアする

2

3.3+また、(例えばdictset又はdequeのような)他の可変コンテナのインタフェースと一致する、list.clear()を使用することができます。

old_list.clear() # removes all items from old_list (same as del old_list[:]) 
関連する問題