Seite 1 von 1

for statement und target_list

Verfasst: Mittwoch 22. Februar 2012, 04:49
von pillmuncher
Dass das folgende syntaktisch korrekt ist, war mir zwar schon vorher klar, aber ich hatte mir nie darüber Gedanken gemacht und es auch nie verwendet. Als ich dies hier gerade gelesen habe, ist mir aufgefallen, dass man zB. sowas machen kann:

Code: Alles auswählen

>>> names = ['Hans', 'Klaus', 'Marie']
>>> some_dict = {}
>>> i = 0
>>> for some_dict[i] in names:
...     i += 1
...
>>> some_dict
{0: 'Hans', 1: 'Klaus', 2: 'Marie'}
Das geht, weil zwischen for und in eine target_list steht, genau wie bei einer Zuweisung. Da bei Zuweisungen sowohl l-values als auch r-values von links nach rechts ausgewertet werden, kann man es noch weiter treiben:

Code: Alles auswählen

>>> n, some_dict[n] = 3, 'Ute'
>>> some_dict
{0: 'Hans', 1: 'Klaus', 2: 'Marie', 3: 'Ute'}
Folglich geht auch sowas:

Code: Alles auswählen

>>> names = ['Hans', 'Klaus', 'Marie']
>>> some_dict = {}
>>> for i, some_dict[i] in enumerate(names):
...     pass
...
>>> some_dict
{0: 'Hans', 1: 'Klaus', 2: 'Marie'}
Wieder eine neue Methode zur Code Obfuscation...

Re: for statement und target_list

Verfasst: Mittwoch 22. Februar 2012, 10:03
von snafu
Falls das jemand nicht auf Anhieb verstanden haben sollte: `i` bekommt den Startwert `0` zugewiesen. `some_dict` meint im Kontext der `for`-Schleife dann, dass dem Schlüsselwert `0` das nächstmögliche Element aus `names` zugewiesen wird. `some_dict` ist also dasselbe wie z.B. das Anlegen des Namens `name` (was man aus dem gewohnten `for name in names:` her kennt), nur dass es natürlich hier ein Zugriff auf das `dict` ist. Bei der Zuweisung verhält es sich exakt so wie bei einem `some_dict[0] = names[0]`. Der Rest sollte dann selbsterklärend sein.

Näheres dazu auch in der Beschreibung zum `for`-Statement aus der Sprachreferenz.

Und bevor jetzt der eine oder andere Anfänger denkt, dies sei ein praktischer Weg, um ein `dict` mit Indexwerten für eine Liste zu erhalten: Nein. Viel klarer und kürzer ist:

Code: Alles auswählen

dict(enumerate(names))

Re: for statement und target_list

Verfasst: Mittwoch 22. Februar 2012, 11:16
von cofi
snafu hat geschrieben:Und bevor jetzt der eine oder andere Anfänger denkt, dies sei ein praktischer Weg, um ein `dict` mit Indexwerten für eine Liste zu erhalten: Nein. Viel klarer und kürzer ist:

Code: Alles auswählen

dict(enumerate(names))
Und bevor jetzt ein Anfaenger denkt Dictionaries mit Indizes waeren eine gute Sache: Nein, Listen machen das besser. ;)

@mick: Ich bin mir grad nicht sicher, ob ich dir dafuer danken soll oder dich fuer den Scheiterhaufen vorschlagen soll :twisted: Vorerst danke :)

Re: for statement und target_list

Verfasst: Mittwoch 22. Februar 2012, 11:33
von /me
Die Frage auf Stackoverflow hatte ich auch gelesen und spontan gedacht: "Matthias, das vergisst du ganz schnell wieder.".