2016-09-30 3 views
0

ich eine seltsame Python Anfänger Frage haben, .. Herumspielen in meinem virtuellen env im Interpreter (Python 3.5):„Backlog“ einer Schleife durch eine Liste in Python

ich eine Liste mit gemischten Typen haben:

lissi = ["foo", "bar". "boo", "baz", 4, 7] 

Und dann "zufällig" versuchen, alle Elemente drucken in einer for-Schleife in einen String verkettet:

for x in lissi: 
    print("Hallo " + x) 

Dies ist natürlich nicht possibl e bcs. wir können nicht konz. Ganzzahlen zu einem String - so werden die ersten Elemente gedruckt und dann gibt es einen TypeError.

Dann tippte ich nur "x" and enter um zu sehen, ob es noch Daten gespeichert ist und ja es ist: x ist 4.

type(x) ist int (versucht, um herauszufinden, ob 7 auch noch da ist). Also meine Frage ist: Was passiert "unter der Haube" in Python in der for-Schleife: Scheint so, als ob jedes erfolgreich verarbeitete Element entfernt wird, aber es ist ein Backlog in x gespeichert, das das erste Element ist, das TypeError geworfen wurde zum? Und gibt es eine Möglichkeit, diese Daten im Fehlerfall aus dem Speicher zu "löschen"?

thx

Antwort

1

Es ist kein Rückstand und nichts wie "jedes erfolgreich verarbeitete Element wird entfernt".
Grundsätzlich bei jeder Iteration for Schleife weist zu Variable x den Wert des nächsten Elements der Liste lissi (muss nicht eine Liste sein, kann jeder iterable sein).
Wenn die Schleife aufgrund einer Ausnahme oder einer break Anweisung unterbrochen wird, bleibt die Variable x intakt und enthält somit den letzten Wert, der von der for-Schleife zugewiesen wurde.
Dies ist in Ordnung, da Schleifen in Python keinen isolierten Bereich haben und es tatsächlich praktisch macht, nach interessanten Elementen zu suchen, die Schleife zu unterbrechen, wenn sie gefunden werden, und sie nicht in einer anderen Variablen speichern zu müssen, bevor sie die Schleife verlassen.

+0

Danke für die "das ist in Ordnung, da Schleifen [...]" Teil, so verstehe ich, ich habe keine Sorge, dass im sehr unwahrscheinlichen Fall s.o. würde eine gemischte Menge von Tausenden von Elementen durchlaufen, ohne zu überprüfen und ihre Typen zu kennen, wäre am Ende ein Speicher-/Oszilloskop-Problem :-) –

-1

Ich glaube, das Problem nicht mit der for Schleife ist, aber mit der print() Aussage.

Sie können nicht + ein string mit einem integer, Beispiel:

Das wird nicht funktionieren:

print("Hallo " + 4) 

noch wird dies:

print(4 + " Hallo") 

wenn es alle ganzen Zahlen ist, wird es funktionieren :

print(4 + 1) 
hiermit ausdrücklich

der Fehler, der von print("Hallo " + 4) gezeigt wird, ist „builtins.TypeError: Can't convert 'int' object to str implicitly

Die Lösung ist die Umwandlung von Integer in String zu tun:

for x in lissi: 
    print("Hallo " + str(x)) 

Nun, für Ihre Frage, ich glaube nicht, es gibt etwas wie ein "Backlog". Die Aufzählung der for x in lissi ist immer noch gültig, und x noch gültig ist, nur, dass während der ersten 4 Aufzählungen der Verarbeitung (wo x ist ein string) die print() Anweisung funktionieren wird, dann wird ein Fehler auf der print() Aussage wirft, aber x ist immer noch ein gültig integer.

+3

OP kennt den Grund von 'TypeError', möchte aber verstehen, wie' for' loop funktioniert. – ElmoVanKielmo

+0

editierte Antwort, x ist in der for-Schleife immer gültig. –

+1

@EdwinvanMierlo Das ist auch nicht der Punkt. OP möchte wissen, warum der Wert von "x" aus der for-Schleife nach einer Ausnahme gespeichert wird. – Aaron3468

2

Die for-Schleife Teil des Umfangs ist es deklariert ist in, so dass der folgende Code den Wert von x ändern:

x = 9 

for x in xrange(3): # iterate 0, 1, 2 
    print(x) 

print(x) # x == 2, x != 9 

Wenn das Element "baz" war, war alles in Ordnung und die print-Anweisung gearbeitet. Python setzte dann die Ausführung fort. Der nächste Schritt war x = 4. Danach ist print "Hallo" + x mit einem Fehler fehlgeschlagen.

Während der Interpreter ausgeführt wird, werden Fehler abgefangen und ausgedruckt, dann wird die Ausführung fortgesetzt. Es gibt keine Bereinigung nach einem Fehler im Interpreter, daher ist der letzte Wert von x immer noch vorhanden, wenn Sie den Wert überprüfen. Deshalb sehen Sie 4.

Verwandte Themen