リストを空にする方法は?


356

このようにリストを空にするのはとても「汚い」ようです:

while len(alist) > 0 : alist.pop()

それを行う明確な方法はありますか?


28
では、なぜpython dictsとsetにはclear()メソッドがあり、リストはないのですか?
仕事

13
ただし、オブジェクトへの参照が複数ある場合は、役立つことがあります。
Ned Deily

3
実行時にプロセスの共有リストをクリアする必要があり、ガベージを待つ必要がない場合に役立ちます(または、間違っていますか?ガベージコレクションを誤解していませんか?)。また、ポップされた各要素をチェックしたい場合は、スライスを使用できないときにデバッグできます(または間違っています)。リストをクリアしている間、プロセスの実行を停止する必要はありません。
DrFalk3n 2009

2
@ S.Lottなぜこれが重要なのか理解していないからといって、他の人がそうではないという意味ではありません。複数のオブジェクトが共通のリストに依存している場合は重要です。いくつかの設計パターンでは、これは重要です。ガベージコレクターは、自分でクリーンアップする必要がないことを意味します。混乱をさらに増すためのライセンスではありません。
UpAndAdam 2013

4
他のより良い答えにもかかわらず、あなたの最初のコードは書かれている可能性があります:while alist:alist.pop()
MrWonderful

回答:


570

これは実際にはリストからコンテンツを削除しますが、古いラベルを新しい空のリストで置き換えません:

del lst[:]

次に例を示します。

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

完全を期すために、スライスの割り当てには同じ効果があります。

lst[:] = []

また、リストの一部を縮小すると同時に一部を置き換えるためにも使用できます(ただし、これは問題の範囲外です)。

やってはことを注意lst = []リストを空にしないで、単に新しいオブジェクトと変数に結合する、それが作成されますlstが、古いリストは同じ要素を持つことになり、それが他の変数バインディングを持っていた場合の効果は明らかであろう。


3
さらに2つの質問:「デル」とは正確に何ですか?(私はそれをde-etesものと推測しますが、それが何であるか本当にわかりません)と2番目:どのように読みますか(声を出してください)[:]
OscarRyz

2
delの正しい
fortran

14
通常、大声でpythonコードxDを読み取ることはありませんが、もし必要なら、「リストの最初から最後までスライスl」と言ったほうがいいと思います。
Fortran

2
@jellybean完全に意図しない^ _ ^英語は私の母国語ではないので、2つのコメントの違いに気づきませんでした。
Fortran、

l = []を実行すると、古いリストのコンテンツはPython GCによってガベージコレクションされませんか?
Alex Punnen

168

あなたは、Python 3.3以上を実行している場合は、使用することができるclear()方法listに平行である、clear()dictsetdequeおよびその他の変更可能なコンテナタイプを:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

リンクされたドキュメントページのとおり、でも同じことができalist *= 0ます。

まとめると、リストをインプレースでクリアするには、4つの同等の方法があります(Zen of Pythonとはまったく対照的です)。

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

6
この答えは一番上にあるはずです、stackoverflowの何が悪いのでしょう!
BreakBadSP 2018

clear()の方が優れています。
sailfish009

61

あなたは試すことができます:

alist[:] = []

つまり、リスト[](0要素)の位置[:](すべてのインデックスを最初から最後まで)でスプライスします。

[:]はスライス演算子です。詳細については、この質問を参照してください。


4
なぜalist = []ですか?
mitenka

16
リストを空にしない@mitenkaは、alistたまたま空になっている別のリストで変数を上書きします。他の誰かが元のリストへの参照を持っている場合、それは
現状の

@mitenkaもう1つの理由は、alist.clear()それalist[:] = []alist本当のリストであることの確認です。alist関数から返されたとしましょうfoo()fooリストを返すと思っていましたが、実際にはが返されましたNone。を使用しalist = []てその間違いをキャッチすることはできません。
-aafulei

32

python 2.5.2では、1.1 usec del l[:]よりも少し遅いことl[:] = []がわかりました。

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2

1
私のマシンでは、Python 2.7.2ではほぼ同じです。どちらもループごとに13.5-13.7 usecで実行されます。
leetNightshade

また、python3 -mtimeit "l = list(range(1000))" "b = l [:]"を測定して、 "b [:] = []"と "del b [:]"を計算する必要があります。それをやりなさい...
rockdaboot 2016

1
私はpython 3.5でベンチマークを行い、leetNightshadeに同意します。.clear()del b[:]およびb[:]=[]同じ全てのランは、(b[:]=[]わずかに遅いである。
Conchylicultor

5
lst *= 0

と同じ効果があります

lst[:] = []

少しシンプルで覚えやすいかもしれません。それ以外は言うことはあまりありません

効率はほぼ同じようです


1
完全を期すために、言及する価値0があります。それ以下の任意の指定された整数が同じ効果を持つことになります。、私は少し悲しいけれどもそれは多くの注目を受けていなかったことを、かなり巧妙なトリック..です
ピーター・バロ

-1
list = []

list空のリストにリセットされます。

通常list、リストオブジェクトのコンストラクタであるなどの予約済みの関数名をシャドウしないでください。たとえば、lstまたはlist_を使用できます。


38
いいえ:リストは変更されません。空のリストが変数に割り当てられるだけですlist。(たとえば)渡されたリストを変更する関数を期待した場合、これは期待どおりに動作しません。
Adam Batkin

10
あんまり。問題は、「リストを空にする方法」ではなく、「リストを含む変数に割り当てる方法」ではありません
Adam Batkin

6
質問はあいまいではありませんでした、opのスニペットはリストから要素をポップしていました(つまり、それを修正しました)...
fortran

7
また、「リスト」は「リスト」タイプをシャドウするため、「リスト」を変数名として使用しないでください。多くのPython開発者はリスト変数名として「L」を使用していますが、私は「lst」を好みます。
steveha 2009

1
リストを空にしたいだけの場合もあり、これは提案されているどの方法とも同じです。おそらくさらに高速です
smac89 2016年

-3

(状況に応じて)使用できる別の単純なコードは次のとおりです。

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

インデックスをリストの長さで開始し、インデックスを0から逆方向に進む必要があります。これにより、インデックスがリストの長さと同じになり、半分にカットされます。

また、while行に「以上」の記号があることを確認してください。省略すると、list [0]が残ります。


15
立方体で車輪を再発明する
CONvid19

はは。これは私がSOで遭遇した2番目の奇妙な答え(+適切なコメント)です。これらの思い出に残るもののためのサイトがあるはずです:D
akinuri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.