Frage

gesandt einen Verweis auf ein Objekt bool und I modifiziert es innerhalb eines Verfahrens. Nach der Ausführung der Methode ist es fertig, war der Wert des Bool außerhalb des Verfahrens unverändert.

Dies führt mich zu glauben, dass Pythons bools Wert übergeben werden. Ist das wahr? Welche anderen Python-Typen verhalten sich so?

War es hilfreich?

Lösung

Python-Variablen sind nicht „Referenzen“ im Sinne von C ++. Vielmehr sind sie einfach vor Ort an ein Objekt gebunden Namen an einer beliebigen Stelle im Speicher. Wenn das Objekt selbst wandelbar ist, Änderungen wird es in anderen Bereichen sichtbar sein, die einen Namen für das Objekt gebunden haben. Viele primitive Typen (einschließlich bool, int, str und tuple) sind unveränderlich jedoch. Sie können ihren Wert nicht an Ort und Stelle ändern; vielmehr Sie einen neuen Wert auf den gleichen Namen in Ihrem lokalen Bereich zugeordnet werden.

In der Tat, fast jede Zeit * Sie Code des Formular foo = X sehen, bedeutet dies, dass der Name foo einen neuen Wert zugewiesen wird (X) im aktuellen lokalen Namensraum, das nicht eine Stelle im Speicher durch foo gestattet, die seine internen Zeiger aktualisiert, um stattdessen auf den Standort der X zu beziehen.

. * - die einzige Ausnahme dazu in Python ist Setter-Methoden für Eigenschaften, die Sie obj.foo = X schreiben können und stellt sie im Hintergrund neu geschrieben hat stattdessen eine Methode, wie obj.setFoo(X) zu nennen

Andere Tipps

Es hängt davon ab, ob das Objekt wandelbar oder unveränderlich. Unveränderliche Objekte verhalten sich wie Sie mit dem Bool sah, während veränderbare Objekte ändern wird.

Referenz: http://www.testingreflections.com/node/view/5126

  

Python werden Referenzen zu Objekten von Wert (wie Java), und alles in Python ist ein Objekt. Das klingt einfach, aber dann werden Sie feststellen, dass einige Datentypen scheinen Pass-by-Wert Eigenschaften aufweisen, während andere wie durch Verweis Pass zu handeln scheinen ... was ist das Problem?

     

Es ist wichtig, wandelbar und unveränderliche Objekte zu verstehen. Einige Objekte, wie Strings, Tupel und Zahlen, sind unveränderlich. sie innerhalb einer Funktion / Methode ändern wird eine neue Instanz und die ursprüngliche Instanz außerhalb der Funktion erstellen / Methode nicht geändert wird. Andere Aufgaben, wie Listen und Wörterbücher sind wandelbar, was bedeutet, dass Sie das Objekt an Ort und Stelle ändern. Daher wird ein Objekt innerhalb einer Funktion / Methode verändert auch außerhalb des ursprünglichen Objekts ändern.

Das ist daran zu erinnern ist, dass es nicht Weg in Python für eine Funktion oder ein Verfahren, einen Namen in der anrufenden Namespace erneut zu binden. Wenn Sie schreiben „Ich hatte einen Verweis auf ein Bool-Objekt, und ich modifizierte es innerhalb einer Methode“, was Sie tatsächlich taten (ich vermute) war der Parameternamen erneut zu binden innen (zu dem der Boolesche Wert durch den Aufruf gebunden war) das Verfahren Körper.

Kurz gesagt, gibt es keine Variablen in Python ; gibt es Objekte (wie wahr und falsch, passieren die bools unveränderlich sein), und Namen. Namen sind, was Sie Variablen nennen, aber Namen zu einem Umfang gehören, können Sie normalerweise nicht Namen als die lokalen Namen anderer ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top