Es scheint so "schmutzig", eine Liste auf diese Weise zu leeren:
while len(alist) > 0 : alist.pop()
Gibt es dafür einen klaren Weg?
Es scheint so "schmutzig", eine Liste auf diese Weise zu leeren:
while len(alist) > 0 : alist.pop()
Gibt es dafür einen klaren Weg?
Antworten:
Dadurch wird der Inhalt tatsächlich aus der Liste entfernt, das alte Etikett wird jedoch nicht durch eine neue leere Liste ersetzt:
del lst[:]
Hier ist ein Beispiel:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
Der Vollständigkeit halber hat die Slice-Zuordnung den gleichen Effekt:
lst[:] = []
Es kann auch verwendet werden, um einen Teil der Liste zu verkleinern und gleichzeitig einen Teil zu ersetzen (dies liegt jedoch nicht im Rahmen der Frage).
Beachten Sie, dass dabei lst = []
die Liste nicht geleert wird lst
, sondern nur ein neues Objekt erstellt und an die Variable gebunden wird. Die alte Liste enthält jedoch weiterhin dieselben Elemente. Der Effekt wird sichtbar, wenn andere Variablenbindungen vorhanden sind.
Wenn Sie Python 3.3 oder besser ausführen, können Sie die clear()
Methode of list
, die parallel zu clear()
of dict
ist set
, deque
und andere veränderbare Containertypen verwenden:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Dasselbe kann laut der verlinkten Dokumentationsseite auch mit erreicht werden alist *= 0
.
Zusammenfassend lässt sich sagen, dass es vier gleichwertige Möglichkeiten gibt, eine Liste an Ort und Stelle zu löschen (ganz im Gegensatz zum Zen von Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Du könntest es versuchen:
alist[:] = []
Was bedeutet: Spleißen Sie in der Liste []
(0 Elemente) an der Stelle [:]
(alle Indizes von Anfang bis Ende)
Das [:] ist der Slice-Operator. Weitere Informationen finden Sie in dieser Frage .
alist = []
?
alist
mit einer anderen Liste, die zufällig leer ist. Wenn jemand anderes einen Verweis auf die ursprüngliche Liste hatte, bleibt dieser unverändert (dh er enthält alles, was darin enthalten war)
alist.clear()
oder alist[:] = []
hilft zu überprüfen, dass alist
wirklich eine Liste ist. Angenommen, Sie wurden alist
von einer Funktion zurückgegeben foo()
. Sie dachten, es würde foo
eine Liste zurückgegeben, aber tatsächlich wurde eine zurückgegeben None
. Mit alist = []
kann diesen Fehler nicht abfangen.
es stellt sich heraus, dass mit Python 2.5.2 del l[:]
etwas langsamer ist als l[:] = []
um 1.1 usec.
$ 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[:]
Und b[:]=[]
alles läuft die gleiche ( b[:]=[]
geringfügig langsamer.
lst *= 0
hat den gleichen Effekt wie
lst[:] = []
Es ist etwas einfacher und vielleicht leichter zu merken. Ansonsten gibt es nicht viel zu sagen
Die Effizienz scheint ungefähr gleich zu sein
0
den gleichen Effekt hat. Es ist ein ziemlich ordentlicher Trick, ich bin ein bisschen traurig, dass er nicht viel Aufmerksamkeit erhalten hat.
list = []
wird list
auf eine leere Liste zurückgesetzt.
Beachten Sie, dass Sie in der Regel nicht reservierte Funktionsnamen Schatten sollen, wie list
, die der Konstruktor für eine Liste Objekt ist - könnten Sie lst
oder list_
stattdessen zum Beispiel.
list
. Wenn Sie erwartet hätten, dass eine Funktion eine übergebene Liste ändert (zum Beispiel), würde dies nicht das tun, was Sie wollen.
Ein weiterer einfacher Code, den Sie (abhängig von Ihrer Situation) verwenden können, ist:
index=len(list)-1
while index>=0:
del list[index]
index-=1
Sie müssen den Index an der Länge der Liste beginnen und rückwärts gegenüber dem Index bei 0 vorwärts gehen, da dies dazu führen würde, dass der Index der Länge der Liste entspricht und nur halbiert wird.
Stellen Sie außerdem sicher, dass die while-Zeile ein Vorzeichen "größer oder gleich" hat. Wenn Sie es weglassen, bleibt die Liste [0] übrig.