2016-06-28 8 views
6

Gewährleistet eine normale For/In-Anweisung die Liste in der Reihenfolge?Bleibt das For/In-Schleifenkonstrukt erhalten?

my_list = [5,4,3,2] 
for i in my_list 
    print(i) 

Das heißt, ist die Schleife garantiert oben 5 4 3 2 jedes Mal drucken?

+1

Ja, es sollte jedes Mal, da Listen bestellt werden. –

+0

Wenn Sie über ein "Diktat" iterieren, kann die Reihenfolge anders als erwartet sein. Python dicts sind ungeordnet. – dawg

+0

Siehe https://docs.python.org/2/reference/compound_stmts.html#the-for-statement – jarmod

Antwort

10

Eine for Schleife Iteration Reihenfolge wird von was auch immer Objekt, das es überläuft gesteuert. Das Iterieren über eine geordnete Sammlung wie eine list wird garantiert, um über Elemente in der Reihenfolge der Liste zu iterieren, aber das Iterieren über eine ungeordnete Sammlung wie eine set macht fast keine Bestellgarantien.

2

Wenn Sie über eine Sequenz (Liste, Tupel usw.) iterieren, ist die Reihenfolge garantiert. Hash-Strukturen (dict, set usw.) haben ihre eigene Reihenfolge - aber für eine gegebene Struktur ist die Reihenfolge jedes Mal gleich. Wenn Sie ein Element hinzufügen oder löschen, ist die Reihenfolge möglicherweise anders.


Betrachten Sie den Code folloing: Ich habe eine Reihe von fünf Elementen machen, und es dann mit vier identischen für Schleifen ausdrucken. Die Reihenfolge ist die gleiche. Dann füge ich zwei Elemente hinzu; Das stört die Reihenfolge.

my_set = set(["Apple", "Banana", "Casaba", "Dinner", "Eggplant"]) 

for food in my_set: 
    print food, 
print "\n" 

for food in my_set: 
    print food, 
print "\n" 

for food in my_set: 
    print food, 
print "\n" 

for food in my_set: 
    print food, 
print "\n" 

my_set.add("Fruitcacke") 
my_set.add("Grape") 

for food in my_set: 
    print food, 
print "\n" 

Ausgang:

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Fruitcacke Grape Apple Dinner Eggplant Banana 

Hinweis, wie die ursprünglichen Elemente sind nicht mehr in der gleichen Reihenfolge: "Abendessen" jetzt kommt nach "Apple".

+2

"jedes Mal" verdient ein wenig Ausarbeitung. Innerhalb eines einzelnen Laufs eines Python-Programms erzeugt die Wiederholung eines Diktats oder zweimaliges Setzen ohne Änderung die gleiche Reihenfolge, aber die Iteration über "dasselbe" dict oder set in zwei verschiedenen Läufen des Programms könnte zwei unterschiedliche Ordnungen erzeugen. – user2357112

+1

Auch wenn die Reihenfolge beim wiederholten Iterieren über einen Satz erhalten bleibt, ist dies nicht garantiert und sollte nicht verlässlich sein. Wenn die Reihenfolge wichtig ist, sollte man eine Datenstruktur wählen, die Ordnung garantiert. – syntonym

+0

@ user2357112: Danke; Ich habe ein Beispiel zur Veranschaulichung hinzugefügt. – Prune

1

Wenn Sie es selbst testen:

my_list = [5,4,3,2] 

for _ in range(20): 
    new_list = [] 
    for i in my_list: 
     new_list.append(i) 
    print(my_list == new_list) 

Und nur für einen Steuerfall:

print([2,4,5,3] == my_list) 
+0

Heh, ich habe es selbst versucht. Daher meine Frage. Aber ich habe seitdem meinen Fehler entdeckt. ;-) –

1

Für Listen, ja, da sie Datenstrukturen in Python bestellt.

Verwandte Themen