Seite 1 von 1

None

Verfasst: Montag 30. März 2020, 12:50
von Bill987654321
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?

Re: None

Verfasst: Montag 30. März 2020, 12:53
von Sirius3
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`.

Re: None

Verfasst: Montag 30. März 2020, 14:10
von __blackjack__
@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.