Mehrfachzuweisung zum Vertauschen eines Wertes zweier Objekte

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

__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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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++.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...?
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Doch, genau dafür stehen die.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

lvalues können links von einer Zuweisung stehen.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

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
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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:``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Jetzt weiß ich mehr als ich mit meiner ursprünglichen Frage wissen wollte. 8)

Gruß
Atalanttore
Antworten