2013-10-16 14 views
7
x,y,z = [1,2,3], [4,5,6], [7,8,9] 
for a,b,c in x,y,z: 
    print(a,b,c) 

Die Ausgabe lautet:Was passiert in diesem Code?

1 2 3 
4 5 6 
7 8 9 

Ich kann nicht geistig navigieren, was Logik ist hier los diese Ausgabe zu erzeugen. Ich bin mir der Zip-Funktion bewusst, damit sich dieser Code so verhält, wie ich es mir vorstelle. aber ich versuche nur zu verstehen, warum es so funktioniert, wenn Sie nicht die Zip-Funktion verwenden.

Ist dies eine bewusste Funktion, eine Funktion, mit der Sie sukzessive mehrere Listen auf diese Weise durchlaufen können? Irgendwie?

+2

"die Art und Weise, die ich klar vorhabe"? LOL - Ich habe keine Ahnung, was du hier vorhast ;-) –

+2

Ich vermute OP will '1 4 7' usw. –

Antwort

8

Sie haben bereits gute Antworten, aber ich denke, angesichts dieser äquivalente Variation es deutlicher machen helfen:

x,y,z = [1,2,3], [4,5,6], [7,8,9] 
for t in x,y,z: 
    a, b, c = t 
    print(a,b,c) 

Sie sind nicht überrascht, dass t nacheinander x gebunden ist, y und z, nicht wahr? Genau die gleiche Sache passiert in Ihrem ursprünglichen Code, außer dass der Teil nicht so offensichtlich ist.

+0

Ich musste "a, b, c = t" lesen (was zuerst seltsam ist) wie dreimal, aber dann klickte es. – Aerovistae

+1

Großartig! Ich dachte, das war der Teil, der die wahre Quelle der Verwirrung war, also brach es in eine eigene Linie aus. Jetzt wirst du nie wieder von etwas überrascht sein ;-) –

+2

EVER, in jedem Bereich des Wissens, den ich erkunde. Ich werde mich immer an diese Nacht erinnern, als die Nacht sich für mich drehte. – Aerovistae

6

Oh Mann, das ist ein Durcheinander. Dies ist einfach zu viel Gebrauch von Pythons iterable unpacking. Die Anweisung a, b, c = iterable weist den Variablen a, b und c einfach die Elemente iterable zu. In diesem Fall muss iterable 3 Elemente haben.

Zuerst haben:

x,y,z = [1,2,3], [4,5,6], [7,8,9] 
# Which is: 
x = [1, 2, 3] 
y = [4, 5, 6] 
z = [7, 8, 9] 

dann Sie haben:

for a, b, c in x, y, z: 
    print(a, b, c) 
# Which is: 
temp = (x, y, z) 
for item in temp: 
    a = item[0] 
    b = item[1] 
    c = item[2] 
    print(a, b, c) 

Eine weitere Sache ist zu beachten, dass die Aussage mytuple = 1, 2, 3 die gleiche wie mytuple = (1, 2, 3) ist.

+0

Diese Antwort in Verbindung mit Tim Peters Antwort macht es glasklar, danke. – Aerovistae

2

Sein ziemlich direkter Code wirklich.

  1. Dies ordnet die drei Listen zu x, y und z.

    x,y,z = [1,2,3], [4,5,6], [7,8,9] 
    
  2. Dies schafft ein Tupel von (x,y,z) und wird jedes Element durchlaufen.

    for a,b,c in x,y,z: 
    

    Allerdings bedeutet die a,b,c, dass die Iterables 3 Objekte

  3. Dann ist dieses druckt a, b und c, zu erwarten ist.

    print(a,b,c) 
    

Wenn Sie sehen wollen, was passiert, würde ich eines der Elemente in y Änderung vorschlagen:

x,y,z = [1,2,3], [3,4,5,6], [7,8,9] 
for a,b,c in x,y,z: 
    print(a,b,c) 

1 2 3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: too many values to unpack 

Oder durch Entfernen eines von x:

x,y,z = [1,2], [4,5,6], [7,8,9] 
for a,b,c in x,y,z: 
    print(a,b,c) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 2 values to unpack 
+0

Mit Tims Antwort ist es für mich klar, letztes Beispiel ist sehr hilfreich. –

0

Es sieht so aus, als ob Sie 3 Arrays haben

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 

und a, b, c repräsentieren die Elemente in jedem Array. Es sieht also so aus, als ob die for-Schleife über 3 Arrays iteriert und die Elemente auf a, b und c abbildet. Dann drucken Sie sie aus.Dann wieder, ich weiß nicht, Python

1

Alles wird hier erklärt: http://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences

Der erste Teil ist zu erkennen, dass Kommas implizit Tupel erstellen. So ist die erste Zeile entspricht:

x,y,z = ([1,2,3], [4,5,6], [7,8,9]) 

Dies bedeutet auch, dass Ihre for-Schleife entspricht:

for a,b,c in ([1,2,3], [4,5,6], [7,8,9]): 

Der zweite Teil zu verstehen Sequenz Auspacken. Das heißt, wenn Sie eine Sequenz der Länge n zu n Variablen zuweisen, ordnet Python die Elemente in der Sequenz entsprechend zu. So ist der erste Teil ist effektiv:

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 

Und die for-Schleife ist die gleiche wie:

for t in (x,y,z): 
    a = t[0] 
    b = t[1] 
    c = t[2] 
    print(a,b,c) 
2
x,y,z = [1,2,3], [4,5,6], [7,8,9] 

ist die gleiche wie zu sagen

x = [1,2,3] 
y = [4,5,6] 
z = [7,8,9] 

Weiter

for a,b,c in x,y,z: 

entspricht

for a,b,c in [x,y,z]: 

, die „einfach und sagt x, y und z wiederum. Weisen Sie ihren Inhalt a, b und c; h. a=x[0], b=x[1], c=x[2].
Letztlich stellt sich dies in

a,b,c = x 
print(a,b,c) 
a,b,c = y 
print(a,b,c) 
a,b,c = z 
print(a,b,c) 
+0

viel hilfreich, aber ich denke 'für a, b, c in [x, y, z]:' sollte geschrieben werden als 'für a, b, c in (x, y, z):', ich meine Tupel statt Liste, Nein? –

2

Es ist eine ungewöhnliche Python Sache. Die implizite Erstellung von Tupel.

Hier erstellen Sie eine anonyme Tupel auf dem rechten

x,y,z = [1,2,3], [4,5,6], [7,8,9] 

Dies ist ein ähnlicher Code:

a, b = 1, 2 

, dass das gleiche ist:

a, b = (1, 2) 

oder

a = 1 
    b = 2 

Es ermöglicht einen gemeinsamen Python-Trick (Idiom).Sie können Werte ohne eine temporäre Variable tauschen:

a, b = b, a 

Das gleiche geschieht, den Schlüssel und Werte eines Wörterbuchs in Wechselwirkung:

for i, j in my_dict.items(): 
    print i, j 

In Ihrem Code, der eine andere temporäre Tupel in der wird für die Schleife erstellt :

for a,b,c in (x,y,z): 
    print(a,b,c) 

Das bedeutet:

for a, b,c in ([1,2,3], [4,5,6], [7,8,9]): 
    print(a,b,c) 

Mit anderen Worten: Schreiben Sie diesen Code für etwas besser lesbar. Python folgt nicht seinem eigenen Mantra: Explizit ist besser als implizit..

BTW, sehen Sie die Spaß Python Zen Eingabe import this in einer Python-Shell.

Verwandte Themen