2016-07-11 10 views
1

Iterieren über veränderbare Objekte sind veränderbare während ausgeführt werden:Kann ich einen veränderbaren Bereich erstellen?

a = [11, 12, 13] 

for i in a: 
    if i == 12: 
     a.append(20) 
    print(i) 

Ergebnisse mit

11 
12 
13 
20 

Und a ist [11, 12, 13, 20]

Aber wenn ich range es verwenden, ist nicht wandelbar

a = [11, 12, 13] 

for i in range(len(a)): 
    if i == 1: 
     a.append(20) 
    print(a[i]) 

Ergebnisse mit

11 
12 
13 

während a noch [11, 12, 13, 20] danach.

Gibt es eine Möglichkeit, ein myrange Objekt zu erstellen, das auf die gleiche Weise funktioniert wie der Bereich, aber während der Ausführung veränderbar ist?

+0

Sie haben keinen Generator in diesem Code. Sind Sie sicher, dass Sie verstehen, was die Code-Snippets bewirken? – user2357112

+1

Seien Sie gewarnt: Dieser erste Code kann Kopfschmerzen verursachen, wenn der Vergleich und der Anhang den gleichen Wert haben. Du bekommst keine Warnung, aber du willst keine Liste mutieren, die du jemals wiederholst ... –

+0

@ user2357112, ich versuche, mir nichts sicher zu sein :-). Aber in diesem Fall glaube ich, ich habe gerade den Begriff "Generator" missbraucht, den ich jetzt korrigiert und aus der Frage eliminiert habe. – Aguy

Antwort

2

Ja, Sie können und wie Sie selbst gesagt a ist bereits wandelbar, so stattdessen über einen Bereich von iterieren, die auf len(a) vor der Schleife basiert, können Sie folgendes tun:

for i, val in enumerate(a): 
    if i == 1: 
     a.append(20) 
    print(val) 

Ausgang:

11 
12 
13 
20 
0

In Ihrem zweiten Code-Schnipsel:

for i in range(len(a)): 
    if i == 1: 
     a.append(20) 
    print(a[i]) 

wenn Sie range(len(a)) es gibt [0, 1, 2] in diesem Fall als die Länge von a==3 Nun ist die for-Schleife nur 3-mal so die iteriert werden würde len(a) wird am Anfang der Schleife ausgeführt, die bereits eine Liste mit 3 Elementen zurückgegeben hat. Wenn Sie die Liste aktualisieren, werden die Änderungen nicht wiedergegeben, da len(a) nie erneut ausgeführt wird.

Wenn Sie die a außerhalb der for-Schleife drucken, sehen Sie das angefügte Element (20) am Ende der Liste.

Während Sie im zweiten Fall versuchen, über die Liste zu iterieren, bleiben die Ergebnisse solange erhalten, bis die gesamte Liste erschöpft ist.

Verwandte Themen