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.
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.
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.
@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.
@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!