このようにリストを空にするのはとても「汚い」ようです:
while len(alist) > 0 : alist.pop()
それを行う明確な方法はありますか?
このようにリストを空にするのはとても「汚い」ようです:
while len(alist) > 0 : alist.pop()
それを行う明確な方法はありますか?
回答:
これは実際にはリストからコンテンツを削除しますが、古いラベルを新しい空のリストで置き換えません:
del lst[:]
次に例を示します。
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
完全を期すために、スライスの割り当てには同じ効果があります。
lst[:] = []
また、リストの一部を縮小すると同時に一部を置き換えるためにも使用できます(ただし、これは問題の範囲外です)。
やってはことを注意lst = []
リストを空にしないで、単に新しいオブジェクトと変数に結合する、それが作成されますlst
が、古いリストは同じ要素を持つことになり、それが他の変数バインディングを持っていた場合の効果は明らかであろう。
あなたは、Python 3.3以上を実行している場合は、使用することができるclear()
方法list
に平行である、clear()
のdict
、set
、deque
およびその他の変更可能なコンテナタイプを:
alist.clear() # removes all items from alist (equivalent to del alist[:])
リンクされたドキュメントページのとおり、でも同じことができalist *= 0
ます。
まとめると、リストをインプレースでクリアするには、4つの同等の方法があります(Zen of Pythonとはまったく対照的です)。
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
あなたは試すことができます:
alist[:] = []
つまり、リスト[]
(0要素)の位置[:]
(すべてのインデックスを最初から最後まで)でスプライスします。
[:]はスライス演算子です。詳細については、この質問を参照してください。
alist = []
ですか?
alist
たまたま空になっている別のリストで変数を上書きします。他の誰かが元のリストへの参照を持っている場合、それは
alist.clear()
それalist[:] = []
がalist
本当のリストであることの確認です。alist
関数から返されたとしましょうfoo()
。foo
リストを返すと思っていましたが、実際にはが返されましたNone
。を使用しalist = []
てその間違いをキャッチすることはできません。
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
.clear()
、del b[:]
およびb[:]=[]
同じ全てのランは、(b[:]=[]
わずかに遅いである。
list = []
list
空のリストにリセットされます。
通常list
、リストオブジェクトのコンストラクタであるなどの予約済みの関数名をシャドウしないでください。たとえば、lst
またはlist_
を使用できます。
list
。(たとえば)渡されたリストを変更する関数を期待した場合、これは期待どおりに動作しません。
(状況に応じて)使用できる別の単純なコードは次のとおりです。
index=len(list)-1
while index>=0:
del list[index]
index-=1
インデックスをリストの長さで開始し、インデックスを0から逆方向に進む必要があります。これにより、インデックスがリストの長さと同じになり、半分にカットされます。
また、while行に「以上」の記号があることを確認してください。省略すると、list [0]が残ります。