Anfänger: Frage zum Programmablauf

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
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

Hallo an alle,

seit kurzem beschäftige ich mich mit Python.
Zurzeit probiere ich einfach ein paar Sachen aus, bin aber gerade bei ein paar Zeilen unsicher was Python da genau macht.

Code: Alles auswählen

def f(a, b):
   print(a)
   print(b)

def x(L):
   L[0] = L[0] - 1
   return L

def y(L):
   L[0] = L[0] + 2
   return L

L = [5, 17]

f(x(L), y(L))
Er gibt mir für beide Listen an Stelle 0 eine 6 aus, aber warum genau? Berücksichtigt Python die nachträgliche Änderung der Liste nachdem die Funktion y(L) aufgerufen auch bei x(L)? Eigentlich hatte ich damit gerechnet das er [4, 17] und [7, 17] ausgibt.

Viele Grüße
Zuletzt geändert von Anonymous am Freitag 25. November 2016, 02:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Ambriador: Ich weiss nicht so genau was Du mit ”nachträglicher Änderung” meinst.

Der Code erstellt erst drei Funktionen `f()`, `x()`, und `y()`.

Dann eine Liste mit zwei Elementen; 5 und 17.

Dann folgt ein Aufruf der Funktion `f()`, wobei allerdings erst die Argumente ausgewertet werden. Erst wird `x()` mit `L` als Argument aufgerufen, danach hat das erste Element der Liste den Wert 4. Und dann wird `y()` mit der Liste aufgerufen, deren erstes Element ja jetzt den Wert 4 hat, und nach dem Aufruf hat das erste Element den Wert 6. Beide Funktionen geben die Liste auch wieder zurück, also die eine, einzige Liste die in diesem Programm existiert, und es wird `f()` mit der Liste für `a` und `b` aufgerufen. `a` und `b` sind damit nicht nur an gleiche Listen gebunden, sondern an die *selbe* Liste. Könnte man sich mit ``print(id(a), id(b))`` in der Funktion auch von überzeugen, oder durch ``print(a is b)``.

Python kopiert bei Zuweisungen an Namen oder Aufrufen, was ja auch nur Zuweisungen an die Namen der Argumente sind, niemals Werte. Wenn man so etwas wünscht, muss man das explizit machen. Also zum Beispiel ``f(x(list(L)), y(list(L)))``, womit `x()` und `y()` jeweils eine (flache) Kopie der Liste übergeben bekommen und nun drei Listen während des Programmablaufs existieren.
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

@BlackJack Damit meinte ich ob die Liste quasi "fest" ist, also ob x() und y() jeweils die ursprüngliche Liste aufrufen oder nicht. Aber du hast meine Frage ja beantwortet :)
Vielen Dank!
Antworten