Nein, können Sie nicht. Wie andere Antworten darauf hinweisen, können Sie (ab?) Das Aliasing von veränderbaren Objekten verwenden, um einen ähnlichen Effekt zu erzielen. Das ist jedoch nicht dasselbe wie C++ - Referenzen, und ich möchte erklären, was tatsächlich geschieht, um Missverständnisse zu vermeiden. In C++ (und anderen Sprachen) sehen Sie, dass eine Variable (und Objektfelder sowie Einträge in Auflistungen usw.) ein Speicherort ist und Sie einen Wert schreiben (z. B. eine ganze Zahl, ein Objekt oder ein Zeiger) auf diesen Ort. In diesem Modell sind Verweise ein Alias für einen Speicherort (beliebiger Art). Wenn Sie einer Nicht-Verweisvariablen zuweisen, kopieren Sie einen Wert (auch wenn es sich nur um einen Zeiger handelt, immer noch um einen Wert) für den Speicherort. Wenn Sie eine Referenz zuweisen, kopieren Sie sie an einen anderen Speicherort. Beachten Sie, dass Sie eine Referenz nicht selbst ändern können - sobald sie gebunden ist (und sie muss, sobald Sie eine erstellen), ändern alle Zuweisungen nicht die Referenz, sondern was auch immer gemeint ist.
In Python (und anderen Sprachen) ist eine Variable (und Objektfelder und Einträge in Sammlungen usw.) nur ein Name. Werte sind irgendwo else (z. B. über den gesamten Heap verstreut), und eine Variable verweist auf einen Wert (nicht im Sinne von C++ - Verweisen, eher wie ein Zeiger minus die Zeigerarithmetik). Mehrere Namen können sich auf denselben Wert beziehen (was im Allgemeinen eine gute Sache ist). Python (und andere Sprachen) ruft alles auf, was benötigt wird, um auf einen Wert als Verweis Bezug zu nehmen, obwohl es mit Dingen wie C++ Referenzen und Pass-by-Reference nicht verwandt ist. Wenn Sie einer Variablen (oder einem Objektfeld oder ...) zuweisen, wird einfach auf einen anderen Wert verwiesen.Das gesamte Modell der Speicherorte gilt nicht für Python, der Programmierer behandelt niemals Speicherorte für Werte. Alles, was er speichert und mischt, sind Python-Referenzen, und diese sind keine Werte in Python, daher können sie nicht Ziel anderer Python-Referenzen sein.
All dies ist unabhängig von der Veränderlichkeit des Wertes - es ist zum Beispiel für Ints und Listen gleich. Sie können keine Variable verwenden, die auf eines der Objekte verweist, und das Objekt, auf das es zeigt, überschreiben. Sie können das Objekt nur anweisen, Teile von sich selbst zu ändern - sagen wir, ändern Sie eine Referenz, die es enthält.
Ist das ein restriktiveres Modell? Vielleicht, aber die meiste Zeit ist es stark genug. Und wenn das nicht der Fall ist, können Sie es umgehen, entweder mit einer benutzerdefinierten Klasse wie der unten angegebenen oder (äquivalent, aber weniger offensichtlich) einer Sammlung mit einem einzelnen Element.
class Reference:
def __init__(self, val):
self._value = val # just refers to val, no copy
def get(self):
return self._value
def set(self, val):
self._value = val
Das wird noch nicht zulassen, dass Sie ein „normales“ Variable oder Objektfeld an Alias, aber Sie können mehrere Variablen auf das gleiche Reference
Objekt verweisen (dito für die wandelbare-Singleton-Sammlung Alternative). Sie müssen nur darauf achten, immer .get()
/.set()
(oder [0]
) zu verwenden.
Gute Erklärung, +1 für die Klärung, dass es nichts mit Wandelbarkeit zu tun hat. –