2009-09-29 5 views
5

Ich habe einen Verweis auf ein Bool-Objekt gesendet, und ich habe es in einer Methode geändert. Nachdem die Methode ihre Ausführung beendet hat, blieb der Wert des Bool außerhalb der Methode unverändert.Sind Pythons Bools nach Wert weitergegeben?

Das führt mich zu der Annahme, dass Python-Bools von Wert übergeben werden. Ist das wahr? Welche anderen Python-Typen verhalten sich so?

+0

Duplizieren, siehe http://stackoverflow.com/questions/534375/passing-values-in-python –

Antwort

12

Python-Variablen sind keine "Referenzen" im Sinne von C++. Sie sind einfach lokale Namen, die an einem beliebigen Ort im Speicher an ein Objekt gebunden sind. Wenn dieses Objekt selbst veränderbar ist, sind Änderungen daran in anderen Bereichen sichtbar, die einen Namen an das Objekt gebunden haben. Viele primitive Typen (einschließlich bool, int, str und tuple) sind unveränderlich jedoch. Sie können ihren Wert nicht direkt ändern. Stattdessen weisen Sie demselben Namen in Ihrem lokalen Bereich einen neuen Wert zu.

In der Tat, fast jede Zeit * Sie Code des Formulars sehen foo = X, bedeutet dies, dass der Name foo wird einen neuen Wert zugewiesen wird (X) im aktuellen lokalen Namensraum, das nicht eine Stelle im Speicher durch foo benannt ist Der interne Zeiger wurde aktualisiert, um stattdessen auf den Speicherort von X zu verweisen.

* - die einzige Ausnahme in Python sind Setter-Methoden für Eigenschaften, die es Ihnen ermöglichen, obj.foo = X zu schreiben und es im Hintergrund umschreiben zu lassen, um stattdessen eine Methode wie obj.setFoo(X) aufzurufen.

+0

Ja, Genau genommen wird ALLES in Python an Adresse übergeben. Python hat nur einen Arg-Passing-Prozess. Es ist nur die Tatsache, dass einige Objekte veränderbar sind und andere nicht die Illusion, dass etwas magisch Komplexer auftritt. –

1

Es hängt davon ab, ob das Objekt veränderlich oder unveränderlich ist. Unveränderliche Objekte verhalten sich wie beim Bool, während sich veränderbare Objekte ändern.

Zum Vergleich: http://www.testingreflections.com/node/view/5126

Python werden Referenzen zu Objekten von Wert (wie Java), und alles in Python ein Objekt ist. Das hört sich einfach an, aber dann werden Sie feststellen, dass einige Datentypen nach dem Wert "pass-by-value" aussehen, während andere sich wie Pass-by-Reference verhalten ... was ist das?

Es ist wichtig, veränderliche und unveränderliche Objekte zu verstehen. Einige Objekte wie Strings, Tupel und Zahlen sind unveränderlich. Wenn Sie sie in einer Funktion/Methode ändern, wird eine neue Instanz erstellt und die ursprüngliche Instanz außerhalb der Funktion/Methode wird nicht geändert. Andere Objekte, wie Listen und Wörterbücher, sind veränderbar, was bedeutet, dass Sie das Objekt direkt ändern können. Wenn Sie also ein Objekt in einer Funktion/Methode ändern, ändert sich auch das ursprüngliche Objekt außerhalb.

+0

-1: Erstens scheint dies eine Kopie der angenommenen Antwort auf die doppelte Frage zu sein (die sein könnte zufällig).Zweitens können Sie unveränderliche Objekte einfach nicht verändern - das ist unveränderlich. Zu sagen, dass das Ändern von unveränderlichen Objekten eine neue Instanz erzeugt, verwirrt das Problem nur. Sie können den Namen eines unveränderlichen Objekts erneut binden, aber das ist nicht das Gleiche! –

+0

Interessant, ich habe das Duplikat nicht einmal gesehen. Diese Frage wurde nicht doppelt gekennzeichnet, als ich antwortete. Googeln "Python pass by reference" gab mir den obigen Link. Außerdem ist das Zitat, mit dem Sie in Konflikt geraten, die akzeptierte Antwort des Duplikats. Ich finde es nicht schwierig zu verstehen, dass, wenn Python es an Ort und Stelle bearbeiten kann, es dies tun wird, und wenn es nicht möglich ist, wird es eine lokale Kopie machen. Hier ist eine andere Seite, die zitiert den Link oben, bietet aber mehr Erklärung: http://bogdan.org.ua/2008/02/11/python-passing-by-value-vs-passing-by-reference.html – FModa3

0

Kurz gesagt, gibt es keine Variablen in Python; Es gibt Objekte (wie True und False, die Bools sind zufällig unveränderlich) und Namen. Namen sind das, was Sie Variablen nennen, aber Namen gehören zu einem Bereich. Sie können normalerweise keine anderen Namen als die lokalen Namen ändern.

+1

"Es gibt keine Variablen in Python" ist pedantisch und irreführend, ich wünschte wirklich, die Leute würden aufhören, es zu sagen. –

1

Die Sache zu erinnern ist, dass es gibt keine Weg in Python für eine Funktion oder eine Methode, einen Namen im aufrufenden Namespace neu zu binden. Wenn Sie schreiben "Ich habe einen Verweis auf ein Bool-Objekt gesendet, und ich habe es innerhalb einer Methode geändert", was Sie tatsächlich getan haben (ich vermute), war, den Parameternamen (an den der bool-Wert durch den Aufruf gebunden war) erneut zu binden der Methodenkörper.