Technisch gesehen, Python verwendet immer die Übergabe von Referenzwerten . Ich werde wiederholen meine andere Antwort um meine Aussage zu untermauern.
Python verwendet immer Pass-by-Reference-Werte. Es gibt keine Ausnahme. Jede Variablenzuweisung bedeutet das Kopieren des Referenzwertes. Keine Ausnahme. Jede Variable ist der Name, der an den Referenzwert gebunden ist. Immer.
Sie können sich einen Referenzwert als die Adresse des Zielobjekts vorstellen. Die Adresse wird bei Verwendung automatisch dereferenziert. Wenn Sie mit dem Referenzwert arbeiten, scheint es, als ob Sie direkt mit dem Zielobjekt arbeiten. Aber es ist immer ein Verweis dazwischen, ein Schritt mehr, um zum Ziel zu springen.
Hier ist das Beispiel, das beweist, dass Python die Übergabe durch Referenz verwendet:
Wenn das Argument als Wert übergeben wurde, wird die äußere lst
konnten nicht geändert werden. Grün sind die Zielobjekte (schwarz ist der darin gespeicherte Wert, rot ist der Objekttyp), gelb ist der Speicher mit dem darin befindlichen Referenzwert - gezeichnet als Pfeil. Der blaue durchgehende Pfeil ist der Referenzwert, der an die Funktion übergeben wurde (über den gestrichelten blauen Pfeilpfad). Das hässliche Dunkelgelb ist das interne Wörterbuch. (Es könnte eigentlich auch als grüne Ellipse gezeichnet werden. Die Farbe und die Form sagen nur, dass es intern ist).
Sie können die id()
eingebaute Funktion, um den Referenzwert (d.h. die Adresse des Zielobjekts) zu erfahren.
In kompilierten Sprachen ist eine Variable ein Speicherbereich, der den Wert des Typs aufnehmen kann. In Python ist eine Variable ein Name (intern als String erfasst), der an die Referenzvariable gebunden ist, die den Referenzwert des Zielobjekts enthält. Der Name der Variablen ist der Schlüssel im internen Wörterbuch, der Wertteil dieses Wörterbucheintrags speichert den Referenzwert für das Ziel.
Referenzwerte sind in Python verborgen. Es gibt keinen expliziten Benutzertyp für die Speicherung des Referenzwertes. Sie können jedoch ein Listenelement (oder ein Element in einem beliebigen anderen geeigneten Containertyp) als Referenzvariable verwenden, da alle Container die Elemente auch als Referenzen auf die Zielobjekte speichern. Mit anderen Worten, die Elemente befinden sich nicht innerhalb des Containers, sondern nur die Referenzen auf die Elemente.
32 Stimmen
Eine kurze Erklärung/Klarstellung finden Sie in der ersten Antwort auf diese Stackoverflow-Frage . Da Zeichenketten unveränderlich sind, werden sie nicht geändert und es wird eine neue Variable erstellt, so dass die "äußere" Variable immer noch denselben Wert hat.
11 Stimmen
Der Code in BlairConrads Antwort ist gut, aber die Erklärung von DavidCournapeau und DarenThomas ist richtig.
79 Stimmen
Bevor Sie die ausgewählte Antwort lesen, sollten Sie diesen kurzen Text lesen Andere Sprachen haben "Variablen", Python hat "Namen". . Denken Sie an "Namen" und "Objekte" anstelle von "Variablen" und "Referenzen" und Sie sollten viele ähnliche Probleme vermeiden.
2 Stimmen
Eine andere Möglichkeit besteht darin, eine Wrapper-"Referenz" wie folgt zu erstellen: ref = type('', (), {'n':1}) stackoverflow.com/a/1123054/409638
1 Stimmen
Für globale Namen kann die Referenzübergabe simuliert werden, indem der Name als String übergeben und globals() verwendet wird.
def change(s): globals()[s] = 'changed'
gefolgt vona = 'orig'; change('a'); print(a)
druckt'changed'
.0 Stimmen
Einige unveränderliche Typen: {int, float, long, complex, str, bytes, tuple, frozen set} Einige veränderliche Typen: {byte array, list, set, dict}
1 Stimmen
Python hat Variablen. Es gibt überhaupt kein konzeptionelles Problem mit diesem Begriff, und er ist allgemein gebräuchlich.
0 Stimmen
jeff Knupps Blog y stupidpythonideas sind einige gute Erklärungen dafür.
0 Stimmen
Geben Sie mir für den Datenrahmen mit dem Namen "bob" (aus einer String-Variablen, und das ist der knifflige Teil) dessen aktuellen Inhalt. Das sollte einfach sein. Leider bekomme ich es nicht.
4 Stimmen
Funktionierender Link: Andere Sprachen haben "Variablen", Python hat "Namen".
13 Stimmen
Neuer offizieller Weg des Iqc's Link: david.goodger.org/projects/pycon/2007/idiomatic/
0 Stimmen
Ich komme von C# und versuche, die Frage besser zu verstehen. In Python ist alles ein Objekt und Objekte können veränderbar oder unveränderbar sein. Der Code hier verwendet "string", das ein unveränderliches Objekt ist, und der Versuch, es innerhalb des Funktionsumfangs zu ändern, wird den Wert des Aufrufers nicht ändern (verhält sich wie Pass-by-Value) & wenn der Code ein veränderbares benutzerdefiniertes Klassenobjekt verwendet - eine Änderung innerhalb des Funktionsumfangs wird den Wert des Aufrufers ändern (verhält sich wie Pass-by-Ref). In C# sehen Sie genau das gleiche Ergebnis (aber die Art, wie es erreicht wird, ist pass-by-value/ref). Ist der Nettoeffekt also nicht derselbe? Ist die Frage also nicht überflüssig?
0 Stimmen
@PeterR weil OOP > 70er Jahre Programmierung ohne Klassen und Objekte. Es ist einfach einfacher, Programme zu schreiben und zu verstehen, wenn sie objektorientiert sind. Ich denke, dass alles im Universum als Objekt dargestellt werden kann, sogar das, was in realen Programmierkonzepten nicht vorhanden ist.
1 Stimmen
@Naren nein, es verhält sich nicht wie ein Aufruf per Verweis oder ein Aufruf per Wert . Die Zuweisung eines Parameters, unabhängig vom verwendeten Typ, wird jamais im Aufrufer zu sehen sein, daher handelt es sich nicht um einen Verweisaufruf. Ähnlich verhält es sich bei Objekten werden nicht kopiert Wenn sie an eine Funktion übergeben werden, wirken sich Mutator-Methoden unabhängig vom verwendeten Typ überall dort auf diese Objekte aus, wo sie referenziert werden.