2017-10-20 1 views
1

Hier ist eine einfache Frage. Meine Aufgabe ist es, eine Liste zu loopen und jedes Element auszudrucken. Nach jedem Drucken möchte ich dieses Element ebenfalls aus der Liste löschen. Mein Code ist:Python: Entfernen des Elements in einer Liste während der Schleife der Liste

>> a = [1,2] 
>> for x in a: 
>> print x 
>> a.remove(x) 
>> print a 

Die Ausgabe lautet:

>> 1 
>> [2] 

jedoch etwas Seltsames geschieht hier: Nur 1 gedruckt wurde und es scheint, nach 1 aus der Liste zu entfernen, springt das Programm aus Schleife direkt. Meine Annahme ist nach dem Ändern des Inhalts der Liste, der Iterator kann auch betroffen sein, aber ich bin nicht sehr sicher. Ein sicherer Weg ist:

>> a = [1,2] 
>> b = list(a) 
>> for x in b: 
>> print x 
>> a.remove(x) 
>> print a 

Könnte mir bitte jemand weitere Erläuterungen zur Verfügung stellen?

+1

Der Iterator verfolgt die Position, ja. Aber warum sollten Sie jedes Element entfernen? Sie werden mit einer leeren Liste enden. – jonatan

+3

'b = list (a)' erstellt eine Kopie der Liste, so dass 'a' und' b' zu verschiedenen Objekten werden. [This] (https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/) könnte nützlich sein. – roganjosh

+0

[Diese Antwort] (https://stackoverflow.com/a/34238688/8747) hat eine anständige Erklärung. –

Antwort

0

Sie sollten keine Elemente aus einer Liste entfernen, die Sie mit for durchlaufen haben.

Ihre Vermutung liegt nahe - man deutlicher sehen, was passiert, wenn Sie eine längere Liste verwenden:

a = [1,2,3,4,5] 
for x in a: 
    print x 
    a.remove(x) 
    print a 

Ausgang:

1 
[2, 3, 4, 5] 
3 
[2, 4, 5] 
5 
[2, 4] 

Er druckt das Element am Index 0, dann Index 1, dann Index 2 ... und dann gibt es keinen Index 3.

In Ihrem Beispiel druckt das Element bei Index 1, dann gibt es keinen Index 2.

2
a = [1,2] 
while a: 
    print a.pop(0) 
    print a 
Verwandte Themen