Seite 1 von 2

Pointer ...

Verfasst: Dienstag 20. Februar 2007, 21:14
von sunmountain
birkenfeld hat geschrieben:"Referenz" bedeutet im normalen Sprachgebrauch, dass eine Variable auf eine andere zeigt. In Python ist das nicht der Fall, beide Namen zeigen gleichberechtigt auf das selbe Objekt.
Eine "Referenz" oder Zeiger oder Pointer oder "Name" in Python ist
ein und dasselbe.
Es "zeigt" auf eine Struktur, die ein Objekt _repräsentiert_.

Also ist das hier:

Code: Alles auswählen

int a,*b;
a=100;
b=&a;
*b=101;
(Danach haben a und *b den Wert 101)
Das selbe wie das:

Code: Alles auswählen

a=100
b=a
b=101
Nur das hier durch die letzte Zuweisung b zu einem eigenständigen Objekt
wird, a == 100 bleibt (bzw. der Wert des Int-Objektes, auf das a zeigt) und
b == 101 ist (bzw. der Wert des Int-Objektes, auf das b zeigt).

Verfasst: Dienstag 20. Februar 2007, 21:18
von sape
@sunmountain: Full Ack.

Verfasst: Dienstag 20. Februar 2007, 21:31
von birkenfeld
Spinne deine Analogie mal weiter, dann siehst du, dass es keine ist:

Code: Alles auswählen

int a, *b;
a = 100;
b = &a;
*b = 101;
a = 102;
Nun ist immer noch a und *b = 102.
b zeigt eben *nicht* auf das "Objekt" 101, sondern auf den *Speicherbereich von a*. a ist eine Variable, das gibt es in Python nicht.

Wenn du den Vergleich analog machen willst, darfst du *nur* Zeiger verwenden.

Verfasst: Dienstag 20. Februar 2007, 21:37
von sape
Ja das stimmt schon. Das hatte aber sunmountain in seinem Beispiel ja schon angesprochen.

Aber das verhalten von Python (Referenzen) kann man doch ungefähr mit den Pointern von C vergleichen. Der unterscheid bei Python (nach außen gesehen) ergibt sich bei mir erst wenn man es mit imutable zu tun hat. Sobald man aber mutable wie ``list``, etc nutzt ist das verhalten das gleiche.

Also wenn man das Bespiel von sunmountain, in Python, auf ``list`` übertragen würde, gebe es nach außen hin betrachtet kein unterschied. -- Es wird tatsächlich mit Referenzen gearbeitet. In einigen Python Tutorials wird ja auch von Referenzen gesprochen.

Verfasst: Dienstag 20. Februar 2007, 21:43
von birkenfeld
Du kannst doch nicht, um die Analogie aufrechtzuerhalten, einfach mal schnell den Knackpunkt des Problems wegdiskutieren! Und der ist nunmal die Zuweisung.

Das ist wie wenn du sagst, "ach, bis auf die paar Probleme ist Nordkorea doch eine passable Demokratie".

Verfasst: Dienstag 20. Februar 2007, 21:50
von sunmountain
birkenfeld hat geschrieben: Wenn du den Vergleich analog machen willst, darfst du *nur* Zeiger verwenden.
Ja, richtig.
Das ist aber der auch der einzige Unterschied.
Einem Pointer, Zeiger, was auch immer ist es relativ brause, worauf er zeigt.
Solange er breit genug ist ...
Für viele ist der Begriff Zeiger, Pointer etc. entsprechend vorbesetzt.
Eine neue Nomenklatur dafür einzuführen, nur weil es um Python geht,
halte ich für nicht angebracht.

Seit wann gibt es in Python keine Variablen ?
Irgendjemand ganz Schlaues hat sie halt "names" genannt (hier die Referenz:
http://docs.python.org/ref/naming.html#naming)
Jeder weiß was gemeint ist.
Ich finde solche Sache ziehmlich esotherisch; sie verbessern nix,
machen Wiedererkennungswerte kleiner.

Natürlich hast Du Recht.
In reinem Python-Sprech.

Verfasst: Dienstag 20. Februar 2007, 21:58
von birkenfeld
sunmountain hat geschrieben: Ja, richtig.
Das ist aber der auch der einzige Unterschied.
Einem Pointer, Zeiger, was auch immer ist es relativ brause, worauf er zeigt.
Solange er breit genug ist ...
Für viele ist der Begriff Zeiger, Pointer etc. entsprechend vorbesetzt.
Eine neue Nomenklatur dafür einzuführen, nur weil es um Python geht,
halte ich für nicht angebracht.
Von Zeigern spricht in Verbindung mit Python ja sowieso keiner.
Seit wann gibt es in Python keine Variablen ?
Irgendjemand ganz Schlaues hat sie halt "names" genannt (hier die Referenz:
http://docs.python.org/ref/naming.html#naming)
Jeder weiß was gemeint ist.
Ich finde solche Sache ziehmlich esotherisch; sie verbessern nix,
machen Wiedererkennungswerte kleiner.
Das ist ja eben das Problem: Newcomer erwarten, dass sich "Variablen" wie Variablen verhalten und das tun sie nicht.
Natürlich hast Du Recht.
In reinem Python-Sprech.
Besser, ein Neuling lernt es gleich richtig.

Dass du weißt worum es geht und was der Unterschied ist, weiß ich. Aber wir müssen doch versuchen, bei Neulingen von Anfang an die richtige "Saat" zu legen ;)

Verfasst: Dienstag 20. Februar 2007, 22:17
von sape
sape hat geschrieben:Ja das stimmt schon. Das hatte aber sunmountain in seinem Beispiel ja schon angesprochen.

Aber das verhalten von Python (Referenzen) kann man doch ungefähr mit den Pointern von C vergleichen. Der unterscheid bei Python (nach außen gesehen) ergibt sich bei mir erst wenn man es mit imutable zu tun hat. Sobald man aber mutable wie ``list``, etc nutzt ist das verhalten das gleiche.

Also wenn man das Bespiel von sunmountain, in Python, auf ``list`` übertragen würde, gebe es nach außen hin betrachtet kein unterschied. -- Es wird tatsächlich mit Referenzen gearbeitet. In einigen Python Tutorials wird ja auch von Referenzen gesprochen.
birkenfeld hat geschrieben:Du kannst doch nicht, um die Analogie aufrechtzuerhalten, einfach mal schnell den Knackpunkt des Problems wegdiskutieren! Und der ist nunmal die Zuweisung.

Das ist wie wenn du sagst, "ach, bis auf die paar Probleme ist Nordkorea doch eine passable Demokratie".
Selbst im Python-Tutorium (Dem offiziellen) wird von Referenzen geredet! Seite 30 (Deutsche Übersetzung vom Python-Tutorium 2.1):
Die Ausführung einer Funktion führt zu einer neuen Symboltabelle mit den lokalenVariablen dieser Funktion. Genauer:
alle Variablenzuweisungen in einer Funktion speichern den Wert in der lokalen Symboltabelle, wohingegen
Referenzen auf Variablen erst in der lokalen Symboltabelle gesucht werden, dann in der globalen Symboltabelle und
dann in der Tabelle der eingebauten Namen. Daher kann in einer Funktion globalen Variablen nicht direkt ein Wert
zugewiesen werden (solange sie nicht in in einer global-Anweisung vorkommen), obwohl sie referenziert werden
können.
Die eigentlichen Parameter (Argumente) eines Funktionsaufrufs werden dann in die lokale Symboltabelle der aufrufenden
Funktion eingefügt, wenn die Funktion aufgerufen wird. Daher werden die Argumente mit Werte-Semantik
(engl. call by value) übergeben (wobei der Wert immer eine Objekt-Referenz und nicht der Wert des Objektes ist).1
Wenn eine Funktion eine andere Funktion aufruft, wird eine neue lokale Symboltabelle für diesen Aufruf erzeugt.
Definiere uns dann mal bitte den begriff Referenz.

Verfasst: Dienstag 20. Februar 2007, 22:33
von birkenfeld
Nuja, auch Übersetzer sind keine Götter, zumal oft Leute übersetzen, die von der Materie nicht besonders viel Ahnung haben.

Außerdem: Ich weiß, dass sehr oft von Variablen, Referenzen, Zeigern, etc. die Rede ist. Hilfreich ist das halt für Leute, die das System verstehen wollen, nicht.