Seite 1 von 1

Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Sonntag 14. Oktober 2018, 17:09
von Atalanttore
Hallo

Ich wollte eine Mehrfachzuweisung anstatt einem Dreieckstausch zum Vertauschen vom jeweiligen `text`-Wert zweier Objekte verwenden. Der Zugriff auf die jeweiligen Werte geht aber nur über entsprechende Methoden (`setText()`, `getText()`).

Ich hab den Code mal auf das Wesentliche verkürzt.

Code: Alles auswählen

def vertauschen(self, objekt1, objekt2):
    objekt1.setText(<Wert2>), objekt2.setText(<Wert1>) = objekt2.getText(), objekt1,getText()
Bei <Wert1> und <Wert2> müssten die entsprechenden Rückgabewerte der `getText()`-Methoden rein, aber da scheitert es dann.

Gruß
Atalanttore

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Sonntag 14. Oktober 2018, 17:15
von Sirius3
Das geht so nicht, weil es Funktionsaufrufe sind:

Code: Alles auswählen

def vertauschen(self, objekt1, objekt2):
    text1, text2 = objekt2.getText(), objekt1.getText()
    objekt1.setText(text1)
    objekt2.setText(text2)

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Sonntag 14. Oktober 2018, 20:58
von ThomasL
auf Anhieb dachte ich mir, das geht doch kürzer

Code: Alles auswählen

def vertauschen(self, objekt1, objekt2):
    text1 = objekt1.getText()
    objekt1.setText(objekt2.getText())
    objekt2.setText(text1)
wenn ich das aber so sehe, geht doch etwas an Übersichtlichkeit verloren, oder wie seht ihr das?

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 15:44
von Atalanttore
Sirius3 hat geschrieben: Sonntag 14. Oktober 2018, 17:15 Das geht so nicht, weil es Funktionsaufrufe sind:
Also kann man Funktionsaufrufe und Zuweisungen generell nicht miteinander verknüpfen.

Sirius3 hat geschrieben: Sonntag 14. Oktober 2018, 17:15

Code: Alles auswählen

def vertauschen(self, objekt1, objekt2):
    text1, text2 = objekt2.getText(), objekt1.getText()
    objekt1.setText(text1)
    objekt2.setText(text2)
So habe ich es bereits umgesetzt, aber trotzdem danke für den Code.


Gruß
Atalanttore

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 15:50
von __deets__
In Python kann man das nicht. Andere sprachen wie C++ erlauben das für gewisse Datentypen, die einen sogenannten lvalue darstellen. Allerdings ist das dort auch eher unüblich.

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 15:51
von snafu
Atalanttore hat geschrieben: Montag 15. Oktober 2018, 15:44 Also kann man Funktionsaufrufe und Zuweisungen generell nicht miteinander verknüpfen.
Dann würde ja fast gar nichts mehr funktionieren. Es ist einfach so, dass links der Name für die Zuweisung steht und rechts der Wert. Folgendes wäre ja genau so wenig ausführbar:

Code: Alles auswählen

call_something() = 42

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 18:22
von Atalanttore
__deets__ hat geschrieben: Montag 15. Oktober 2018, 15:50 In Python kann man das nicht. Andere sprachen wie C++ erlauben das für gewisse Datentypen, die einen sogenannten lvalue darstellen. Allerdings ist das dort auch eher unüblich.
Die folgende Erklärung von MSDN zu lvalue habe ich kaum verstanden, aber trotzdem danke für den Hinweis.
MSDN hat geschrieben:Jeder C++-Ausdruck ist entweder ein lvalue oder einen rvalue. Ein lvalue verweist auf ein Objekt an, das über einen einzelnen Ausdruck hinaus beibehalten wird. Sie können sich einen lvalue als ein Objekt vorstellen, das über einen Namen verfügt. Alle Variablen, einschließlich nicht veränderbarer (const) Variablen, sind lvalues. Ein rvalue ist ein temporärer Wert, der nicht über den Ausdruck hinaus beibehalten wird, der diesen nutzt.
URL: https://msdn.microsoft.com/de-de/librar ... 2147217396
Gruß
Atalanttore

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 18:28
von snafu
@Atalanttore:
Was außer dem reinen Namen noch geht, ist x.y = z sowie x['y'] = z und x[0] = 1. Aber dass ein Wert von der rechten Seite magisch in die Klammern auf der linken Seite rutscht, ist leider nicht möglich.

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 18:35
von Atalanttore
@snafu: Genau das wollte ich wissen.

BTW, für Strings gibt es ja die Methode `format()`, wo man Platzhalter für Werte definieren kann. :P

Gruß
Atalanttore

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 18:38
von snafu
Atalanttore hat geschrieben: Montag 15. Oktober 2018, 18:22 Die folgende Erklärung von MSDN zu lvalue habe ich kaum verstanden, aber trotzdem danke für den Hinweis.
Ein lvalue ist halt ein Datentyp, der auch links in der Gleichung stehen darf. Ein rvalue darf nur rechts stehen. Wenn du weiter auf der Seite liest, dann siehst du auch passende Beispiele dafür. Das soll dich aber nicht weiter verwirren. Es geht hier ja um Python und nicht um C++.

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 18:43
von snafu
Atalanttore hat geschrieben: Montag 15. Oktober 2018, 18:35 BTW, für Strings gibt es ja die Methode `format()`, wo man Platzhalter für Werte definieren kann. :P
Ja, die gibt es. Das sind Methoden-Parameter, die dann in den String wie gewünscht eingefügt werden. Nur hat das nicht wirklich etwas mit dem Problem zu tun, das du hier beschrieben hast. Oder etwa doch...?

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 18:49
von Atalanttore
Kann ich für `lvalue` dann `left_value` und `right_value` für `rvalue` im Hinterkopf behalten oder haben die Anfangsbuchstaben damit nichts zu tun?

Gruß
Atalanttore

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 19:09
von __deets__
Doch, genau dafür stehen die.

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Montag 15. Oktober 2018, 19:10
von __deets__
lvalues können links von einer Zuweisung stehen.

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Dienstag 16. Oktober 2018, 15:24
von Atalanttore
Das die Variable, der etwas zugewiesen werden soll, links neben dem Zuweisungsoperator steht, ist doch eigentlich der Standard oder verwechsle ich da was?

Gruß
Atalanttore

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Dienstag 16. Oktober 2018, 15:40
von __blackjack__
@Atalanttore: Das ist sehr verbreitet ja. Es kann aber auch anders herum gemacht werden. Zum Beispiel könnte man einen Pfeil nach rechts als Zuweisungsoperator haben, also so etwas wie ``a -> b`` oder mit einem Wert ``42 -> answer``. Auch in Python gibt es Zuweisungen wo das Ziel rechts vom Operator/Schlüsselwort steht: ``import a as b`` oder ``except RuntimeError as error:``.

Re: Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Verfasst: Dienstag 16. Oktober 2018, 15:52
von Atalanttore
Jetzt weiß ich mehr als ich mit meiner ursprünglichen Frage wissen wollte. 8)

Gruß
Atalanttore