items lassen sich nicht löschen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rooky
User
Beiträge: 2
Registriert: Samstag 7. Oktober 2017, 12:40

Hallo,

folgendes Anfängerproblem. Ich habe eine Liste list_1 = ['a', 'b', 'c', 'd'] und möchte einfach alle items mithilfe einer Funktion löschen.

Code: Alles auswählen

list_1 = ['a', 'b', 'c', 'd']
def remove_items(list):
	"""Remove all items from a list"""
	for item in list: 
		list.remove(item)
remove_items(list_1)
print(list_1)
Als Ergebnis habe ich leider keine leere Liste:
>>>['b', 'd']

Das selbe habe ich mit längeren Listen versucht, es wird immer ein item übersprungen und somit nicht entfernt. Versuch ich mit derselben Methode die items mit print() auszugeben anstatt mit remove() zu entfernen gibt es keine Probleme. Weiß jemand warum das so ist?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da ist dir etwas begegnet was prinizpiell zu den unangenehmen Stellen der Programmierung gehoert: das veraendern von Datenstrukturen waehrend man ueber diese traversiert.

Die einfache Antwort ist: macht man nicht. Was passiert ist, das der Iterator, den die for-Schleife von der List bekommt ein kleines internes Objekt ist, welches sich den Index merkt, an dem er gerade steht. Er liefert dann auf Nachfrage das naechste Element, und inkrementiert den Index um eins. Und dann gehst du hin und entfernst ein Element aus der Liste. Womit sie um eines kuerzer ist, und der Index jetzt quasi nochmal inkrementiert wurde.

Die Loesung ist simpel: statt Auswahl zu entfernender Elemente und Entfernung zusammen zu machen, sammelst du die zu entfernenden Elemente auf, und iterierst danach ueber diese Liste und entfernst aus der Originalliste.

Oder im konkreten Fall sparst du dir das ganze und rufst gleich liste_1.clear() auf. Oder liste_1[:] = [].
rooky
User
Beiträge: 2
Registriert: Samstag 7. Oktober 2017, 12:40

Alles klar, vielen Dank.
Antworten