Verschiedene Arten, Listen zu löschen

207

Gibt es einen Grund, etwas Komplizierteres als eine dieser beiden Zeilen zu tun, wenn Sie eine Liste in Python löschen möchten?

old_list = []
old_list = list()

Der Grund, den ich frage, ist, dass ich dies gerade in einem laufenden Code gesehen habe:

del old_list[ 0:len(old_list) ]
johannix
quelle
1
Warum tust du das? Garbage Collection funktioniert. Warum ignorieren Sie nicht einfach den alten Listenwert und lassen Python ihn automatisch bereinigen?
S.Lott
40
@ S.Lott: Das Poster hat den Code nicht geschrieben und fragt, warum der ursprüngliche Autor dies möglicherweise getan hat.
John Fouhy
1
Sie könnten auch tun: während l: l.pop ()
RoadieRich
12
LOL. Ich bin sicher, das ist effizient.
FogleBird
18
Nicht im Zusammenhang mit Ihrer Frage, aber Sie sollten len nicht verwenden, wenn Sie ein Slice angeben. a[:x]bedeutet Anfang zu x und a[x:]bedeutet x zu Ende. a[ 0:len(a) ]kann geschrieben werden als a[:]. Sie können auch Negative verwenden, um vom Ende an zu zählen ( a[-1]ist das letzte Element).
idbrii

Antworten:

356

Das Löschen einer Liste wirkt sich auf alle anderen Referenzen derselben Liste aus.

Diese Methode wirkt sich beispielsweise nicht auf andere Referenzen aus:

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

Aber dieser tut:

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

Sie könnten auch tun:

>>> a[:] = []
Koba
quelle
86
Sie könnten auch tundel a[:]
idbrii
1
Warum wirkt sich der erste nur aus a? Ich dachte aund bezog mich bauf dasselbe Objekt ... Ich möchte nur wissen warum. Vielen Dank.
Alston
37
Mit Python 3.3 und höher können Sie a.clear()problemlos loslegen!
Marek Lewandowski
4
@Stallman, weil Sie zuerst eine Referenz für 'a' ändern, um auf ein neues Array zu verweisen, ohne eines zu
löschen
4
Es wäre großartig, wenn jemand den Leistungsunterschied zwischen diesen Methoden zeigen könnte!
Suanmeiguo
37

Wenn Sie alist = []dies tun , wird die Liste nicht gelöscht , sondern nur eine leere Liste erstellt und an die Variable gebunden alist. Die alte Liste bleibt bestehen, wenn andere Variablenbindungen vorhanden sind.

Um tatsächlich eine Liste löscht an Ort und Stelle , können Sie eine der folgenden Arten verwendet werden :

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

Siehe die Veränderliche Sequenztyp Dokumentation für weitere Details.

Eugene Yarmash
quelle
2
Ich habe getestet und alist * = 0 ist die schnellste, die nächstschnellste ist alist.clear () und die beiden anderen Methoden sind gleich schnell. Können Sie erklären, warum Alist * = 0 am schnellsten ist?
Jenny
3
@ Jenny: Es werden einfach weniger (oder weniger teure) Opcodes unter der Haube verwendet. Beispielsweise muss die Operatorversion keine Methodennamen nachschlagen oder Slices erstellen.
Eugene Yarmash
"Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun." Python scheint hier :)
Nik O'Lai
36

Es gibt eine sehr einfache Möglichkeit, eine Python-Liste zu löschen. Verwenden Sie del list_name [:] .

Beispielsweise:

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

Es scheint mir, dass del Ihnen den Speicher zurückgibt, während das Zuweisen einer neuen Liste dazu führt, dass die alte nur gelöscht wird, wenn der gc ausgeführt wird.

Dies kann für große Listen nützlich sein, für kleine Listen sollte es jedoch vernachlässigbar sein.

Edit : Als Algorias spielt es keine Rolle.

Beachten Sie, dass

del old_list[ 0:len(old_list) ]

ist äquivalent zu

del old_list[:]
besen
quelle
2
gc wird nicht in Zyklen ausgeführt. Die Liste wird freigegeben, sobald die letzte Referenz gelöscht wird.
Algorias
2
Algorias: Dies gilt für CPython, möglicherweise jedoch nicht für andere Implementierungen.
Mhsmith
2
del old_list [0: len (old_list)] und del old_list [:] haben das gleiche Ergebnis, aber das letztere ist schneller (in Python 2.6 überprüft)
Roy Nieterau
6
del list[:] 

Löscht die Werte dieser Listenvariablen

del list

Löscht die Variable selbst aus dem Speicher

ytpillai
quelle
5

Es gibt zwei Fälle, in denen Sie eine Liste löschen möchten:

  1. Sie möchten den Namen old_listin Ihrem Code weiter verwenden.
  2. Sie möchten, dass die alte Liste so schnell wie möglich als Müll gesammelt wird, um Speicherplatz freizugeben.

In Fall 1 fahren Sie einfach mit der Aufgabe fort:

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

In Fall 2 würde die delAnweisung den Referenzzähler auf das Listenobjekt reduzieren, auf das der Name old listzeigt. Wenn das Listenobjekt nur mit dem Namen old_listauf angezeigt wird, wäre der Referenzzähler 0 und das Objekt würde für die Speicherbereinigung freigegeben.

    del old_list
Alex
quelle
3

Wenn Sie die Liste löschen, brauchen Sie die Liste offensichtlich nicht mehr. In diesem Fall können Sie einfach die gesamte Liste mit der einfachen Löschmethode löschen.

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

Falls Sie es erneut benötigen, können Sie es erneut initialisieren. Oder einfach nur seine Elemente durch löschen

del a[:]
lavee_singh
quelle
-4

Eine andere Lösung, die gut funktioniert, besteht darin, eine leere Liste als leere Referenzliste zu erstellen.

empt_list = []

Zum Beispiel haben Sie eine Liste als a_list = [1,2,3]. Um es zu löschen, machen Sie einfach Folgendes:

a_list = list(empt_list)

Dadurch wird a_listeine leere Liste wie die erstellt empt_list.

Mounir Ben
quelle
Kein Grund, eine leere Liste zu erstellen. Verwenden Sie einfach a_list = list ().
Daniel Harding