リストをクリアするさまざまな方法


207

Pythonでリストをクリアしたいときに、これらの2行の1つよりも複雑なことをする理由はありますか?

old_list = []
old_list = list()

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

del old_list[ 0:len(old_list) ]

1
なぜあなたはこれをやっている?ガベージコレクションは機能します。古いリストの値を単に無視して、Pythonに自動的にクリーンアップさせてみませんか?
S.Lott、2009年

40
@ S.Lott:投稿者はコードを書かず、元の作者がなぜそうしたのかと尋ねています。
John Fouhy、

1
次も実行できます:while l:l.pop()
RoadieRich 2009年

12
笑。それは効率的だと確信しています。
FogleBird 2009年

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

回答:


356

その場でリストをクリアすると、同じリストの他のすべての参照に影響します。

たとえば、このメソッドは他の参照には影響しません。

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

しかし、これは:

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

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

>>> a[:] = []

86
次のこともできますdel a[:]
idbrii

1
なぜ最初のものは影響するだけaですか?私は同じオブジェクトを考えab参照しました...なぜか知りたいだけです。ありがとう。
Alston

37
python 3.3以降あなたが行くことができa.clear()、問題はありません!
Marek Lewandowski、2014

4
@Stallmanは、最初に 'a'の参照を変更して、新しい配列を指すように変更し、1つをクリアせず、bがまだ古い配列を指しているためです
Pax0r

4
誰かがこれらの方法のパフォーマンスの違いを示すことができれば素晴らしいです!
Suanmeiguo 2015

37

実行してalist = []もリストはクリアされず、空のリストが作成されて変数にバインドされるだけですalist。他の変数バインディングがあった場合、古いリストは引き続き存在します。

実際にリストクリアするには、次のいずれかの方法を使用できます。

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

詳細については、可変シーケンスタイプのドキュメントページをご覧ください。


2
私はテストし、alist * = 0が最も速く、次に速いのはalist.clear()であり、他の2つのメソッドも同等に高速です。alist * = 0が最速である理由を説明していただけますか?
ジェニー

3
@ジェニー:それは単にフードの下でより少ない(またはより安価な)オペコードを使用します。たとえば、オペレーターバージョンはメソッド名を検索したり、スライスを作成したりする必要はありません。
Eugene Yarmash

「それを行うには、1つ、できれば1つだけの明白な方法が必要です。」Pythonはここで輝いています:)
Nik O'Lai

36

Pythonリストをクリアする非常に簡単な方法があります。del list_name [:]を使用しますます。

例えば:

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

13

delはメモリを返してくれるようですが、新しいリストを割り当てると、gcが実行されたときにのみ古いリストが削除されます。

これは大きなリストの場合は便利ですが、小さなリストの場合は無視できます。

編集:アルゴリズムとして、それは問題ではありません。

ご了承ください

del old_list[ 0:len(old_list) ]

に相当

del old_list[:]

2
gcはサイクルで実行されません。リストは、最後の参照が削除されるとすぐに解放されます。
アルゴリズム09年

2
アルゴリズム:これはCPythonには当てはまりますが、他の実装には当てはまらない場合があります。
mhsmith 2011

2
del old_list [0:len(old_list)]とdel old_list [:]は同じ結果になりますが、後者の方が高速です(Python 2.6で確認)
Roy Nieterau

6
del list[:] 

そのリスト変数の値を削除します

del list

変数自体をメモリから削除します


5

リストをクリアしたい場合が2つあります。

  1. old_listコードでさらに名前を使用したい場合。
  2. 古いリストをできるだけ早くガベージコレクションしてメモリを解放したいとします。

ケース1の場合、割り当てを続行します。

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

ケース2の場合、delステートメントは、名前がold list指すリストオブジェクトへの参照カウントを減らします。リストオブジェクトがold_listat という名前でのみポイントされている場合、参照カウントは0になり、オブジェクトはガベージコレクションのために解放されます。

    del old_list

3

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

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

ただし、必要な場合は、再初期化できます。または単に単にその要素を

del a[:]

-4

正常に機能する別のソリューションは、空のリストを参照の空のリストとして作成することです。

empt_list = []

たとえば、次のようなリストがあり a_list = [1,2,3]ます。クリアするには、次のようにします。

a_list = list(empt_list)

これによりa_list、と同様に空のリストが作成されempt_listます。


empt_listを作成する理由はありません。a_list = list()を使用するだけです。
ダニエルハーディング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.