python, ändern Liste innerhalb einer Funktion
Angenommen ich habe die Funktion mit parameter Liste, und innen ist es Körper möchte ich ändern Liste übergeben wurden, durch kopieren der Elemente von einem array in die Liste ein:
def function1 (list_arg):
a = function2() #function2 returns an array of numbers
list_arg = list(a)
list1 = [0] * 5
function1(list1)
list1
[0,0,0,0,0]
Tun, wenn es, wie dieses, es funktioniert nicht. Nach der Ausführung function1(list1)
, list1
bleibt unverändert. So, wie man function1
zurück list1
mit den gleichen Elementen (zahlen) als array a
?
- was bedeutet
'a = some array'
bedeuten? - Also, was genau erwarten Sie, dass die
list1
enthalten, wenn Sie Ihre Funktion zurück? Was ist der Inhalta
und wo ist es definiert? - FYI, ist die standard-syntax für Kommentare ist
#Your comment here
. Die Verwendung von Zeichenfolgen ist in der Regel reserviert für, wenn Sie wollen, mehrzeilige Kommentare oder docstrings. - Lesen Sie dieser kann helfen, Ihr Verständnis, und nicht nur von Funktionen.
- ausgezeichnete Erklärung in der oben genannten Website von "John Y"
InformationsquelleAutor roberto | 2014-02-26
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie weisen etwas auf die variable
list_arg
ist, wird es dann auf den Punkt in den neuen Wert. Der Wert deutete auf vor, dass die Zuordnung der ursprünglichen Liste) bleiben unverändert.Wenn Sie, weisen Sie stattdessen etwas zu Elemente auf der Liste, dies wird sich ändern, die original-Liste:
Dadurch wird Ihr code so funktionieren, wie Sie es wollte.
Aber Bedenken Sie, dass in-place änderungen sind schwer zu verstehen und wahrscheinlich verwirren die nächste Entwickler, der Sie zur Pflege Ihres code.
Was ich denke, Sie werden Fragen ist, warum nach dem Aufruf
f(a)
, wennf
re-ordnet diea
Sie übergeben,a
ist immer noch die "alten"a
Sie übergeben.Der Grund dafür ist, wie Python Variablen behandelt und übergeben Sie an Funktionen. Sie bestanden durch Verweis, aber die Referenz übergeben wird von Wert (was bedeutet, dass eine Kopie erstellt wird). Dies bedeutet, dass die Referenz, die Sie haben im inneren
f
ist eigentlich eine Kopie der Referenz übergeben. Dies wiederum impliziert, dass, wenn Sie zum zuweisen der variable innerhalb der Funktion. Es ist eine lokale variable nur innerhalb der Funktion; re-zuweisen, es würde nichts ändern, die in der äußeren Bereiche.Nun, wenn Sie, anstatt die Neuzuweisung der lokalen variable/Referenz innerhalb
f
(das wird nicht funktionieren, da es eine Kopie), durchführen von Mutationen-Operationen, wieappend()
, die Liste, die Sie übergeben haben wird geändert, nachdemf
ist getan.Siehe auch die Frage Wie gebe ich eine variable per Referenz? behandelt das problem und zu möglichen Lösungen weitere Details.
TL;DR: Neuzuweisung einer Variablen innerhalb einer Funktion nicht ändern, die variable, die Sie als argument übergeben, die außerhalb der Funktion. Durchführung von Mutationen-Operationen auf die variable, jedoch wird es ändern.
Können Sie betreiben auf der Liste, um dessen Werte ändern (z.B., fügen Sie etwas, um es, oder legen Sie deren Werte), aber änderungen werden außerhalb der Funktion nur, wenn Sie arbeiten auf die Referenz auf das übergebene Objekt:
Wenn Sie Fragen haben, wenn Sie dies tun, drucken Sie die
id
s:Drucke:
Dass
x
ist geändert in Ort, aber die Zuordnung zu der Funktion, lokale variablelist_arg
hat keine Auswirkungen aufx
, denn nur dann tritt ein anderes Objekt zulist_arg
.Bist du das ändern einer Referenz auf eine lokale variable. Wenn Sie übergeben, list_arg diese Weise:
list_arg ist ein Verweis auf eine zugrunde liegende Liste-Objekt. Wenn Sie dies tun:
Du bist verändert, was list_arg bedeutet, dass innerhalb der Funktion. Da die Funktion beendet direkt danach, list_arg = list(a) keine Wirkung hat.
Wenn Sie wollen, um tatsächlich ändern Sie den Verweis auf die Liste, die Sie zu tun haben, ordnen Sie dem Ergebnis der Funktion.
Oder Sie können ändern Sie den Inhalt der Liste ohne eine änderung der Referenz.