Warum sollte ich in Python auf "Namen" und "Bindung" verweisen anstatt auf "Variablen" und "Zuweisung"?

8

Warum sollte ich in "Python" auf "Namen" und "Bindung" verweisen anstatt auf "Variablen" und "Zuweisung"? Ich weiß, dass diese Frage ein bisschen allgemein ist, aber ich würde wirklich gerne wissen:)

    
BoJack Horseman 20.12.2013, 08:57
quelle

5 Antworten

14

In C und C ++ ist eine Variable ein benannter Speicherort. Der Wert der Variablen ist der Wert, der an diesem Ort gespeichert ist. Weisen Sie der Variablen zu und ändern Sie diesen Wert. Also ist die Variable der Speicherort, nicht der Name dafür.

In Python ist eine Variable ein Name, der sich auf ein Objekt bezieht. Der Wert der Variablen ist dieses Objekt. Bis jetzt klingt das Gleiche. Aber weisen Sie der Variablen zu und nicht ändern Sie das Objekt selbst, sondern Sie ändern, auf welches Objekt sich die Variable bezieht. Also ist die Variable der Name, nicht das Objekt.

Aus diesem Grund, wenn Sie die Eigenschaften von Python im Abstract betrachten oder wenn Sie mehrere Sprachen gleichzeitig sprechen, ist es nützlich, verschiedene Namen für diese zwei verschiedenen Dinge zu verwenden. Um die Dinge klar zu halten, könnten Sie vermeiden, in Python über Variablen zu sprechen, und sich darauf beziehen, was der Zuweisungsoperator als "bindend" und nicht als "Zuweisung" tut.

Beachten Sie, dass Die Python-Grammatik über "Zuweisungen" als eine Art Anweisung spricht, nicht als "Bindungen" ". Zumindest einige der Python-Dokumentation ruft Namen Variablen . Im Kontext von Python allein ist es nicht falsch , dasselbe zu tun. Verschiedene Definitionen für Jargonwörter gelten in verschiedenen Kontexten.

    
Steve Jessop 20.12.2013, 09:47
quelle
4

In beispielsweise C ist eine Variable eine Speicherstelle, die durch einen bestimmten Namen identifiziert wird. Zum Beispiel bedeutet int i; , dass es eine (normalerweise) 4-Byte-Variable gibt, die durch i identifiziert wird. Dieser Speicherplatz wird unabhängig davon zugewiesen, ob ihm bereits ein Wert zugewiesen ist. Wenn C i = 1000 ausführt, wird der am Speicherort i gespeicherte Wert auf 1000 geändert.

In Python ist der Speicherort und die Größe für den Interpreter irrelevant. Der nächste Python kommt zu einer "Variablen" in der C-Richtung ist ein Wert (z. B. 1000), der als ein Objekt irgendwo im Speicher existiert, mit oder ohne einem angehängten Namen. Die Bindung an einen Namen geschieht durch i = 1000 . Dies weist python an, ein Integer-Objekt mit dem Wert 1000 zu erstellen, falls es nicht bereits existiert, und an den Namen 'i' zu binden. Ein Objekt kann relativ einfach an mehrere Namen gebunden werden, z. B .:

%Vor%

Dies erklärt den Unterschied zwischen den Begriffen, aber solange Sie den Unterschied verstehen, spielt es keine Rolle, welchen Sie verwenden. Es sei denn, du bist pedantisch.

    
aquavitae 20.12.2013 09:24
quelle
2

Ich bin mir nicht sicher, ob der Name / die Bindungsbeschreibung am einfachsten zu verstehen ist, zum Beispiel war ich immer verwirrt, selbst wenn ich etwas genau verstanden habe, wie Python (und insbesondere cpython) funktioniert / p>

Der einfachste Weg zu beschreiben, wie Python funktioniert, wenn Sie von einem C-Hintergrund kommen, ist zu verstehen, dass alle Variablen in Python tatsächlich Zeiger für Objekte sind und beispielsweise ein list -Objekt ist in der Tat ein Array von Zeigern zu Werten. Nach a = b zeigen sowohl a als auch b auf dasselbe Objekt.

Es gibt ein paar knifflige Teile, in denen dieses einfache Modell der Python-Semantik zu versagen scheint, zum Beispiel mit list erweitertem Operator += , aber dafür ist es wichtig zu beachten, dass a += b in Python nicht ist Dasselbe wie a = a + b , aber es handelt sich um eine spezielle Inkrementoperation (die auch für Benutzertypen mit der __iadd__ -Methode definiert werden kann; a += b ist tatsächlich a = a.__iadd__(b) ).

Eine weitere wichtige Sache zu verstehen ist, dass, während in Python alle Variablen tatsächlich Zeiger sind, immer noch kein Zeigerkonzept existiert. Mit anderen Worten, Sie können keinen "Zeiger auf eine Variable" an eine Funktion übergeben, so dass die Funktion die Variable ändern kann: was in C ++ durch

definiert ist %Vor%

oder in C von

%Vor%

in Python kann nicht definiert werden, da es keine Möglichkeit gibt, "eine Variable" zu übergeben, Sie können nur "Werte" übergeben. Die einzige Möglichkeit, einen allgemeinen schreibbaren Platz in Python zu übergeben, ist die Verwendung einer Callback-Schließung.

    
6502 20.12.2013 09:42
quelle
1

Ich würde sagen, dass die Unterscheidung wegen einiger der Unterschiede zwischen C und Python bedeutsam ist:

  1. Duck-Typisierung: Eine C-Variable ist immer eine Instanz eines bestimmten Typs - in Python ist es nicht der Typ, auf den sich ein Name bezieht.

  2. Flache Kopien - Versuchen Sie Folgendes:

    %Vor%

Dies ist sinnvoll, da a und b beide Namen sind, die einen Teil der Zeit an eine Listeninstanz gebunden haben, anstatt separate Variablen zu sein.

    
Steve Barnes 20.12.2013 09:22
quelle
0

Wer hat gesagt, Sie sollten? Es sei denn, Sie diskutieren Probleme, die direkt mit Namensbindungsoperationen zusammenhängen. Es ist vollkommen in Ordnung, in Python wie in jeder anderen Sprache über Variablen und Zuweisungen zu sprechen. Natürlich ist die genaue Bedeutung in verschiedenen Programmiersprachen unterschiedlich.

Wenn Sie ein Problem mit "Benennen und Binden" debuggen, dann verwenden Sie diese Terminologie, weil Python-Sprachreferenz es verwendet: um so spezifisch und präzise wie möglich zu sein, um das Problem durch Vermeidung zu lösen unnötige Mehrdeutigkeit.

Wenn Sie andererseits wissen möchten, was der Unterschied zwischen Variablen in C und Python ist, dann diese Bilder könnten helfen .

    
jfs 20.12.2013 09:38
quelle

Tags und Links