Seite 1 von 1
[neuerWikiArtikel] Mehrfachanweisungen (multiple assignment)
Verfasst: Freitag 23. April 2010, 12:11
von usepolt
Moin!
Ich habe mich ein wenig näher mit Mehrfachzuweisungen beschäftigt. Dabei ist ein kleiner Wiki-Artikel entstanden.
http://wiki.python-forum.de/usepolt/seq ... 0unpacking
Zurzeit liegt er noch in meinem Heimverzeichnis, bis ich das allgemeine OK für ein verschieben in den offiziellen Bereich bekomme.
Also, wie siehts aus?

Was kann man noch besser machen? Wo soll der Beitrag später mal hin?
Grüße
Verfasst: Freitag 23. April 2010, 12:43
von BlackJack
Ich finde das Wort Variable(n) problematisch. Werte oder Objekte an Namen binden finde ich besser.
Der erste Satz ist IMHO auch falsch denn es werden nicht mehreren Variablen mehrere Werte zugewiesen sondern mehreren Variablen wird jeweils *ein* Wert zugewiesen.
Auf der rechten Seite steht auch nur *ein* Wert! Der kann ein beliebiges "iterable" sein, also zum Beispiel wie in Deinen Fällen ein Tupel. Es geht aber auch jedes andere Iterable das exakt so viele Elemente liefert wie Namen auf der linken Seite stehen. Zum Beispiel hätte man auch ``a, b = range(2)`` schreiben können.
Der Titel ist IMHO auch unpassend. Unter Mehrfachzuweisung hätte ich das hier verstanden: ``a = b = 1``. Das was Du da machst läuft bei mir unter der Bezeichnung "sequence unpacking". Was wie oben schon angedeutet im Grunde auch zu einschränkend ist, weil jedes "iterable" verwendet werden kann, nicht nur solche die das Sequenz-Protokoll implementieren.
Verfasst: Freitag 23. April 2010, 13:24
von usepolt
Hallo BlackJack!
Danke für die schnelle Antwort.
BlackJack hat geschrieben:Ich finde das Wort Variable(n) problematisch. Werte oder Objekte an Namen binden finde ich besser.
Das ist, denke ich, Ansichtssache.
Variable(n) finde ich sehr aussagekräftig, zumal in den offiziellen Dokumentationen auch die rede von
Variabl(en) und das
Werte Variablen zugewiesen werden.
BlackJack hat geschrieben:Der erste Satz ist IMHO auch falsch denn es werden nicht mehreren Variablen mehrere Werte zugewiesen sondern mehreren Variablen wird jeweils *ein* Wert zugewiesen.
Stimmt.
BlackJack hat geschrieben:Auf der rechten Seite steht auch nur *ein* Wert! Der kann ein beliebiges "iterable" sein, also zum Beispiel wie in Deinen Fällen ein Tupel. Es geht aber auch jedes andere Iterable das exakt so viele Elemente liefert wie Namen auf der linken Seite stehen. Zum Beispiel hätte man auch ``a, b = range(2)`` schreiben können. Der Titel ist IMHO auch unpassend. Unter Mehrfachzuweisung hätte ich das hier verstanden: ``a = b = 1``. Das was Du da machst läuft bei mir unter der Bezeichnung "sequence unpacking". Was wie oben schon angedeutet im Grunde auch zu einschränkend ist, weil jedes "iterable" verwendet werden kann, nicht nur solche die das Sequenz-Protokoll implementieren.
Das leuchtet mir ein.
Ich werde also die Einleitung nochmal überabeiten, will das ganze aber nicht so stark vertiefen da dieser Artikel eher an Anfänger gerichtet ist. Daher auch das Gedankenexperiment.
Danke dir.
Verfasst: Freitag 23. April 2010, 13:32
von Leonidas
usepolt hat geschrieben:BlackJack hat geschrieben:Ich finde das Wort Variable(n) problematisch. Werte oder Objekte an Namen binden finde ich besser.
Das ist, denke ich, Ansichtssache.
Variable(n) finde ich sehr aussagekräftig, zumal in den offiziellen Dokumentationen auch die rede von
Variabl(en) und das
Werte Variablen zugewiesen werden.
Führt aber zu Verwirrungen wie ich hier im Forum schon ganz, ganz oft gesehen habe. Daher finde auch ich die Bezeichnung Name und Objekt besser, vielleicht wäre es schon auch dazu einen Artikel zu haben?
Achja, und natürlich auch ein großes Lob für das Anlegen einer Wikiseite!

Verfasst: Freitag 23. April 2010, 13:47
von usepolt
Hallo Leonidas!
Leonidas hat geschrieben:Führt aber zu Verwirrungen wie ich hier im Forum schon ganz, ganz oft gesehen habe. Daher finde auch ich die Bezeichnung Name und Objekt besser, vielleicht wäre es schon auch dazu einen Artikel zu haben?
Hätte nicht gedacht das mit den Variablen doch so ein großes Thema ist. Ich persönlich finde die
Name/Objekt-Geschichte irgendwie... gewöhnungsbedürftig
Ich werd mal schauen ob ich einen WikiArtikel zusammen kriege, dazu lese ich mich mal im Forum rum um ein paar Beispiele zu kriegen.
Leonidas hat geschrieben:Achja, und natürlich auch ein großes Lob für das Anlegen einer Wikiseite! Smile
Danke dir

Verfasst: Freitag 23. April 2010, 14:28
von Darii
usepolt hat geschrieben:Hätte nicht gedacht das mit den Variablen doch so ein großes Thema ist. Ich persönlich finde die
Name/Objekt-Geschichte irgendwie... gewöhnungsbedürftig
Ist es auch nicht, es gibt nur 1, 2 Leute für die das ein Weltuntergang ist und es deswegen ständig jedem unter die Nase reiben müssen.
Ich hatte mir vorhin eigentlich schon ein Kommentar dazu gespart, aber da das nochmal angesprochen wurde konnte ich mir das jetzt nicht mehr verkneifen.
Verfasst: Freitag 23. April 2010, 14:35
von Leonidas
Darii hat geschrieben:Ist es auch nicht, es gibt nur 1, 2 Leute für die das ein Weltuntergang ist und es deswegen ständig jedem unter die Nase reiben müssen.
Es geht halt um faktische Korrektheit die einem ermöglicht das Objektsystem deutlich besser zu verstehen als mit dem plumpen Begriff Variable, der sogar noch Speicherbereichskonnotationen mitträgt.
Verfasst: Freitag 23. April 2010, 14:41
von Darii
Leonidas hat geschrieben:Es geht halt um faktische Korrektheit die einem ermöglicht das Objektsystem deutlich besser zu verstehen als mit dem plumpen Begriff Variable, der sogar noch Speicherbereichskonnotationen mitträgt.
Es ist einfach nur so, dass sich Python genauso verhält wie jede andere x-beliebige Scriptsprache – sogar wie C wenn man mit Pointern arbeitet – und dass die Einführung neuer Begrifflichkeiten da irgendwelche Besonderheiten impliziert, die einfach nicht vorhanden ist.
Die Begriffsdefinition von Wiki trifft es imo eigentlich ganz gut: Variable (programming), a symbolic name associated with a value and whose associated value may be changed
Verfasst: Freitag 23. April 2010, 15:02
von usepolt
Was ist eurer Meinung nach die beste Art abzufragen ob ein Objekt iterierbar ist? Ich dachte da an
try except:
Code: Alles auswählen
>>> def is_iterable(iterable) :
... try :
... iter(iterable)
... return True
... except TypeError :
... return False
...
>>> is_iterable(2)
False
>>> is_iterable("sdasdas")
True
>>> is_iterable((1,0))
True
>>>
Verfasst: Freitag 23. April 2010, 15:06
von Leonidas
Darii hat geschrieben:Es ist einfach nur so, dass sich Python genauso verhält wie jede andere x-beliebige Scriptsprache
Ja, dort würde ich auch eher von Namen sprechen als von Variablen.
Darii hat geschrieben:sogar wie C wenn man mit Pointern arbeitet
In C sind Variablen reservierte Bereiche im Speicher, das ist unter Python eben nicht so. Und das führt halt manchmal zu Verwirrungen.
@usepolt: mach dafür doch bitte einen neuen Thread auf, da es ja mit diesem nichts zu tun hat.
Verfasst: Freitag 23. April 2010, 15:08
von Darii
Ab Python 2.6 würde ich naiv sagen isinstance(obj, collections.Iterable)
Verfasst: Freitag 23. April 2010, 15:15
von usepolt