Wenn in Python eine Funktion eine Liste als Argument empfängt, wird der Parameter effektiv zu einer Referenz, die auf den Speicherort der ursprünglichen Liste verweist in Erinnerung. Alle an der Liste innerhalb der Funktion vorgenommenen Änderungen werden direkt in der Aufrufliste widergespiegelt.
Der folgende Code zeigt jedoch ein eigenartiges Verhalten, das dieses Verständnis in Frage stellt:
<code class="python">def function1(list_arg): a = function2() # function2 returns an array of numbers list_arg = list(a) list1 = [0] * 5 function1(list1) print(list1) # [0, 0, 0, 0, 0]</code>
In diesem Beispiel Wir beabsichtigen, dass Funktion1 Liste1 ändert, indem ihre Elemente durch diejenigen aus Array a ersetzt werden. Das Ergebnis zeigt jedoch, dass Liste1 unverändert bleibt. Warum passiert das?
Das Problem ergibt sich aus der falschen Annahme, dass die Zuweisung eines neuen Werts zur Variablen list_arg innerhalb von Funktion1 die ursprüngliche Liste ändert. In Wirklichkeit ändert diese Zuweisung nur die Referenz von list_arg, sodass sie auf ein anderes Objekt im Speicher zeigt. Die ursprüngliche Liste, auf die der aufrufende Code verweist, bleibt unberührt.
Um die ursprüngliche Liste innerhalb von Funktion1 erfolgreich zu ändern, müssen wir ihre einzelnen Elemente ändern. Dies kann durch Slice-Zuweisung erreicht werden:
<code class="python">list_arg[:] = list(a)</code>
Slice-Zuweisung ersetzt den gesamten Bereich der Elemente in list_arg durch die Werte aus list(a). Tatsächlich ändert diese Aktion direkt die ursprüngliche Liste.
Während die Slice-Zuweisung eine praktische Lösung darstellt, ist es wichtig, das Potenzial für Verwirrung zu beachten. Durch die Änderung einer vorhandenen Liste wird der Code weniger transparent und anfälliger für Missverständnisse seitens anderer Entwickler, die ihn verwalten. Erwägen Sie alternative Ansätze, z. B. die Rückgabe einer neuen geänderten Liste aus der Funktion, um die Klarheit und Lesbarkeit des Codes zu verbessern.
Das obige ist der detaillierte Inhalt vonWarum ändert das Zuweisen einer neuen Liste zu einem Funktionsargument nicht die ursprüngliche Liste in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!