None

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
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Habe folgenden Code geschrieben:

Code: Alles auswählen

vereinsnamen = ["Hamburg", "Frankfurt", "Hannover", "Dortmund"]
print (vereinsnamen)
a=(vereinsnamen)
print (a)

b=a
b.reverse()
print (b)

c=b.reverse()
print ((c),"=c")
Python gibt folgendes aus:

['Hamburg', 'Frankfurt', 'Hannover', 'Dortmund']
['Hamburg', 'Frankfurt', 'Hannover', 'Dortmund']
['Dortmund', 'Hannover', 'Frankfurt', 'Hamburg']
None =c
>>>

Warum wird bei c "None" ausgegeben?
Kann ich die 3 Zeilen
b=a
b.reverse()
print (b)
zu 2 Zeilen zusammenfassen? Wenn ja - wie?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt wissen, dass Variablennamen nur Verweise auf die eigentlichen Objekte sind.
Es gibt also genau EINE Liste, die über die Namen `vereinsnamen`, `a` und `b` ansprechbar ist.
`b.reverse()` kehrt dann diese EINE Liste um, die dann auch für vereinsname und a zugänglich ist.
`b.reverse` hat keinen Rückgabewert, das ist in Python der Wert `None`.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bill987654321: Bei der Zuweisung an `a` und das `c` in der letzten Zeile sind unnötig geklammert.

Zwischen Funktion/Methoden und die öffnende Klammer des Aufrufs gehört kein Leerzeichen. Bei `reverse()` machst Du doch auch keines, warum dann bei `print()`?

Die drei Zeilen kannst Du nicht zusammenfassen, weil das drei Anweisungen sind und keine der drei Anweisungen zu einem Wert ausgewertet werden kann, den man in einen der anderen Ausdrücke einsetzen könnte. Da die `reverse()`-Methode einen Seiteneffekt hat, kann man den Effekt der letzten beiden der drei Zeilen auch nicht mit `reversed()` und `list()` ausdrücken, weil das die Liste unverändert liesse. Falls das okay sein sollte, kann man das natürlich machen:

Code: Alles auswählen

b = a
print(list(reversed(b)))
Da stellt sich dann natürlich noch die Frage was für einen Sinn die Zuweisung *überhaupt* macht an der Stelle, denn man hätte da statt `b` auch `a` nehmen können.

Grundsätzlich sollte man mit dem Verändern von Listen oder Datenstrukturen allgemein sehr vorsichtig sein. Es sollte klar sein, notfalls durch Dokumentation falls die Funktions-/Methodennamen nicht deutlich genug sind, dass eine Datenstruktur verändert wird, damit nicht an anderer Stelle im Code Überraschungen auftreten weil sich plötzlich etwas geändert hat mit dem man nicht gerechnet hat. Es sollte immer eine Art ”Besitzer” geben der das machen darf und wo man das auch erwartet. Beispielsweise kann eine Funktion eine Liste die sie selbst erstellt hat gerne auch umdrehen. Wenn die Liste aber als Argument übergeben wurde, dann sollte das sehr deutlich gemacht werden wenn sie in der Funktion umgedreht wird, damit sich der Aufrufer nicht darüber wundert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten