Übergeben von Referenz vs. Wert in Python

Pass Reference Vs



Nachdem Sie Python kennen, können Sie Fälle finden, in denen die Funktionen die Argumente an einer Stelle nicht ändern, wie Sie es erwarten würden, insbesondere wenn Sie mit vielen anderen Computersprachen vertraut sind. Viele Sprachen verwenden Methodenargumente als Referenzen, die als Referenz an aktuelle Variablen übergeben werden. Wenn Sie ein fortgeschrittener Python-Entwickler sind und die besondere Art und Weise von Python verstehen möchten, Methodenargumente zu behandeln, dann ist dieser Leitfaden genau das Richtige für Sie.

Python unterstützt die Übergabe von Objektreferenzen

Pass-by-Reference und Pass-by-Value sind zweifellos die beiden bekanntesten und am leichtesten verständlichen Methoden zur Parameterübergabe zwischen Programmiersprachen. Python ist leider 'Pass-by-Object-Reference', weder Pass by Value noch Pass by Reference, oft als Call by Object Reference oder Call by Sharing bezeichnet. Es ist nützlich, sich das Konzept selbst genauer anzusehen, indem Sie es in Segmente aufteilen, während Sie sich mit den technischen Besonderheiten des Vorbeigehens von Reference befassen:







Passieren: dies bedeutet, eine Methode mit einem Argument zu versehen.



Nach Referenz: Dies bedeutet, dass sich das Argument, das Sie zur Methode verschieben, auf eine Variable bezieht, die sich jetzt im Speicher befindet, anstatt auf eine andere Replik dieser Variablen.



Wenn Sie der Methode eine Referenz auf eine definierte Variable zuweisen, würde die Variable, der sie entspricht, von allen Operationen auf dieser Referenz explizit beeinflusst. Betrachten wir nun ein Beispiel, wie dies in der Praxis funktioniert. In diesem Beispiel haben wir eine Variable definiert: verärgert' einen Wert von haben 4 . In diesem Szenario ist die Variable „ verärgert' wurde an seiner Stelle nicht verändert. Python scheint Ihr bereitgestelltes Argument anstelle eines Verweises auf eine vorhandene Variable als eigenständigen Wert zu behandeln.





Würde dies bedeuten, dass Python Argumente statt nach Referenz nach Wert verschiebt? Python verschiebt Argumente durch Zuweisungen, also weder nach Referenz noch mit Wert. Die Logik dafür ist zweifach:



Derzeit ist der übergebene Parameter ein Zeiger auf ein Objekt. Bestimmte Arten von Daten sind änderbar, und einige sind nicht änderbar.

Wenn wir ein veränderliches Objekt in eine Funktion verschieben, erhält die Funktion eine Referenz auf dasselbe Objekt, sodass Sie alles zur Zufriedenheit Ihrer Seele mutieren können; Der externe Gültigkeitsbereich würde jedoch nichts wissen, bevor Sie die Referenz in der Funktion wieder hinzufügen. Wenn Sie fertig sind, zielt die externe Referenz nur auf das eigentliche Objekt. Wenn Sie ein unveränderliches Objekt in eine Funktion verschieben, kann die externe Referenz immer nicht neu verbunden werden, und Sie können das Objekt nicht einfach mutieren. Um die Dinge viel einfacher zu machen, lassen Sie uns einen nach dem anderen verstehen.

Pass-by-Referenz

Zuallererst müssen Sie verstehen, dass die Variable ‚mylist‘ selbst keine Liste ist, sondern sich auf eine Liste mit Werten bezieht. Sie können die Variable „mylist“ als Container mit Werten bezeichnen. Die Listenwerte sind Objekte. Die Variable ‚mylist‘ wurde mit ihrem Inhalt direkt in die Funktion geliefert.

Sowohl list als auch meine Liste scheinen im folgenden Codebeispiel dieselbe Speichervariable zu sein und gelten daher für dasselbe Speicherobjekt. Aus diesem Grund wird bei der Ausgabe 'Saeed' ausgegeben.

Jede Aktion, die an der Variablen oder Entität ausgeführt wird, wird sofort an die Aufrufermethode gespiegelt. Die Methode kann den Wert der Variablen vollständig modifizieren und auf ein ganz anderes Objekt abzielen. Wie Sie in der Funktion „set_list“ sehen können, haben wir den Listeninhalt geändert und eine ganz neue Liste mit dem Element „Aqsa“ gedruckt. Dies liegt daran, dass wir die geänderte Liste zurückgegeben und in derselben Zeile wie der Aufrufer gedruckt haben.

Die Methode kann auch die Elemente der Variablen für das gleiche Ergebnis wie unten neu zuordnen. Wie Sie sehen, haben wir einen neuen Wert an die Liste angehängt und die Änderung wurde übernommen. Wir haben eine eindeutige Zeichenfolge an eine Liste angehängt und an den Aufrufer zurückgegeben. Zusammenfassend lässt sich sagen, dass die Methode und der Aufrufer während der gesamten Pass-by-Beziehung dieselbe Variable und dasselbe Objekt verwendet haben.

Wertüberschreitung

Durch die Wertübergabe erhält die Methode ein Duplikat des Argumentobjekts, das der Aufrufer ihr zuweist. Dadurch wird sichergestellt, dass das Originalelement unverändert bleibt und alle vorgenommenen Änderungen an separaten Speicherorten in einer Replik desselben Objekts aufbewahrt werden.

Sie gilt gleichermaßen für alle Operationen, die von der Methode an einer Variablen oder der Entität ausgeführt werden. Duplikate von Variablen und Objekten im Gültigkeitsbereich der Aufrufmethode werden vollständig getrennt, um sie zusammenzufassen.

Objekt nach Referenz übergeben

Da Python in dieser Situation anders ist, erhalten die Methoden von Python die sehr ähnliche Objektreferenz im Speicher, auf die sich der Aufrufer bezieht. Umgekehrt erhält die Technik die Variable „mylist“ (den Container) nicht. Die Caller-Methode speichert dasselbe Objekt; die Methode generiert den eigenen Container und generiert einen ganz neuen Index für seinen eigenen, genau wie bei der Übergabe von Werten.

Der Aufrufer und die Methode sprechen von demselben Objekt im Speicher, aber wenn die angehängte Methode ein externes Element auf eine Liste anwendet, wird die Aufrufer-Entität modifiziert. Sie haben mehrere Labels, aber es sind die gleichen Dinge. Beide Variablen enthalten ein sehr ähnliches Objekt. Das ist der Sinn hinter seiner Beziehung zur Bewegung am Objekt. Im Speicher verwenden die Methode und der Aufrufer ein ähnliches Objekt, fangen sie jedoch über mehrere Variablen ab. Die Aufrufervariable (der Container) wird durch Änderungen an der Methodenvariablen (dem Container) nicht geändert; nur die Daten oder der Inhalt werden geändert.

Abschluss

Python arbeitet unabhängig von Sprachen, die das Verschieben nach Referenz oder Wert von Argumenten akzeptieren. Methodenargumente sind lokale Variablen, die jedem an die Methode übergebenen Wert zugewiesen wurden. Aber das hindert Sie immer noch nicht daran, dieselben Ergebnisse zu erzielen, die Sie in anderen Sprachen finden würden, wenn Sie Argumente per Stellvertreter verschieben.