Referenz

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo,

momentan stehe ich ein bisschen auf der Leitung:

Gegeben

Code: Alles auswählen

class Object:
    def __init__(self, r):
        self.r1 = r
myvar = 15
o = Object (15)
o.r1 = 22
Nun möchte ich, dass sich die Variable myvar auch automatisch mitändert.
Das heisst sie soll am Schluss den Wert 22 haben.

Gibt es da irgendwas wie Referenz oder Pointer?
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

ehm... ich glaube der Klassenname ist unklug gewaehlt, da "Object" der Datentyp ist, von dem in Python alles abgeleitet wird.

Wird myvar denn immer global deklariert? Dann mach es so:

Code: Alles auswählen

class Object:
    def __init__(self, r): self._r1 = r

    def set_r1(self, r):
        self._r1 = r
        myvar = r

    r1 = property((lambda self: self._r1), set_r1)
    del set_r1


myvar = 15
o = Object (15)
o.r1 = 22
nun wird myvar automatisch mit gesetzt, wenn du o.r1 zuweist, da dann anstelle einer einfachen zuweisung die funktion set_r1 verwendet wird.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also sowas macht man nicht, ist sehr unschön.

Erklär mal ein bisschen genauer was du machen möchtest, vielleicht gibt es einen eleganteren Weg.

Gruss
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

da muss ich rayo uebrigens absolut recht geben...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Danke, habe es nicht richtig ausgedrückt.

(Ja, ich weiss, etwas eigenartig, sieht nicht nach schönen programmierstil aus).

Es sollet quasi eine Referenz übergeben werden, und die Variable soll irgendeine sein (nicht nur global)

Also in der Art.

Code: Alles auswählen

class Object:
     def __init__(self, r): 
         #r soll irgendwie eine Referenz sein
         # wie in C++ (int &refvariable)
         self._r1 = r

    def set_r1(self, r):
        self._r1 = r
 
 

myOtherObject.myOtherVar = 15
o = Object (myOtherObject.myOtherVar)
o.set_r1 (22)

#myOtherObject.myOtherVar 
#soll jetzt mitgeändert werden (auch 22 sein)
#bei Listen ist es ja so ausser sie werden kopiert mit [:]

rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hallo

Also direkt mit unveränderbaren Typen geht es nicht, da werden immer neue Objekte an die Namen gebunden.

Du musst also entweder eine eigene Klasse als Wrapper schreiben und anstatt mit "= 22" mit z.B. "wrapper.set(22)" arbeiten. Oder du machst einfach eine Liste rundum:

Code: Alles auswählen

a = [0]
b = a
a[0] = 10
print b
Ist auch nicht wirklich schön.

In was für einem Fall brauchst du sowas?

Gruss
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Hatten Klassen nicht den Sinn Dinge zu kapseln?
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich würde dir ganz stark empfehlen noch mal Gedanken über das Design zu machen, das was du da vor hast ist mit Sicherheit nicht sinnvoll. Wenn "myvar" schon immer den selben Wert haben soll wie "r1", dann ist es auch angebracht eine Referenz auf "r1" zu verwenden.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Grundsätzlich: Es gibt keine Variablen und Referenzen in Python, sondern Namen und Objekte.

Objekte sind an Namen gebunden, bzw. Namen zeigen auf Objekte.

Sagen wir, wir haben zwei Namen, die auf ein Objekt zeigen (x = y = 1).
Jetzt weisen wir dem einen Namen ein anderes Objekt zu (y = 2).
Dann zeigt x immer noch auf das Objekt "1".

Die Objekte ändern sich hierbei *nicht*.

Jetzt betrachten wir eine andere Situation: wir haben wieder zwei Namen und ein Objekt, diesmal eine Liste (x = y = []).
Nun ändern wir das Objekt: x.append(1).
x und y zeigen *beide* weiterhin auf das gleiche Objekt, also:
x == [1] *und* y == [1].

Sprich: Wenn du zwei Namen (instance._r1 und myvar) auf das gleiche Objekt zeigen lässt und nun das Objekt änderst, hast du was du erreichen willst.

Nun sind aber nicht alle Objekte veränderbar wie Listen. Integer oder Strings sind unveränderlich.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

EyDu hat geschrieben:Ich würde dir ganz stark empfehlen noch mal Gedanken über das Design zu machen, das was du da vor hast ist mit Sicherheit nicht sinnvoll. Wenn "myvar" schon immer den selben Wert haben soll wie "r1", dann ist es auch angebracht eine Referenz auf "r1" zu verwenden.
Ach immer die Hinweise auf das Design :(. Ist ja nur ein Beispiel.
Was mir nicht klar ist: bei Listen geht das, aber bei "normalen" Variablen nicht. Warum ist das so?
Ich meine, ich finde es grundsätzlich eh nicht gut, dass Listen nicht automatisch (deep) copy kopiert werden.

Spezieller Fall:
Es gibt ein Objekt in wxPython, dass einen Panel ist.
Nun wird ein SidePanel mit diesem "Zeiger", wenn man so will initialisiert.
Dieser wird dann in der Subklasse zurückgesetzt, aber die Variable im Panel bleibt unverändert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Francesco hat geschrieben:Was mir nicht klar ist: bei Listen geht das, aber bei "normalen" Variablen nicht. Warum ist das so?
Ich meine, ich finde es grundsätzlich eh nicht gut, dass Listen nicht automatisch (deep) copy kopiert werden.
Siehe meinen Post zu Objekten und Namen. Gewöhn dir ab, von Variablen zu sprechen, die gibts nicht.

Der Unterschied liegt nicht an Listen und "normalen" Objekten, sondern daran, was du tust: das eine Mal änderst du das *Objekt*, das andere Mal die Zuordnung Name -> Objekt.

Damit wird es verständlich, dass Listen bei Zuweisung nicht kopiert werden: die Liste hat *keine Ahnung* davon, dass sie einem anderen Namen zugewiesen wird. Bei diesem Vorgang wird nämlich nur ein neuer Name angelegt, der auf ein Objekt (zufälligerweise eine Liste) verweist.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

birkenfeld hat geschrieben:
Francesco hat geschrieben:Was mir nicht klar ist: bei Listen geht das, aber bei "normalen" Variablen nicht. Warum ist das so?
Ich meine, ich finde es grundsätzlich eh nicht gut, dass Listen nicht automatisch (deep) copy kopiert werden.
Siehe meinen Post zu Objekten und Namen. Gewöhn dir ab, von Variablen zu sprechen, die gibts nicht.

Der Unterschied liegt nicht an Listen und "normalen" Objekten, sondern daran, was du tust: das eine Mal änderst du das *Objekt*, das andere Mal die Zuordnung Name -> Objekt.

Damit wird es verständlich, dass Listen bei Zuweisung nicht kopiert werden: die Liste hat *keine Ahnung* davon, dass sie einem anderen Namen zugewiesen wird. Bei diesem Vorgang wird nämlich nur ein neuer Name angelegt, der auf ein Objekt (zufälligerweise eine Liste) verweist.
Ok danke! :)

also kurz gesagt: unveränderliche Objecte => neue Namenzuweisung auf das gleich Objekt, bei veränderlichen nicht, oder?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

birkenfeld hat geschrieben:Grundsätzlich: Es gibt keine Variablen und Referenzen in Python, sondern Namen und Objekte.
Natürlich gibt es Referenzen:

Code: Alles auswählen

a = "muh"
b = a
Die Namen b und a zeigen beide auf das selbe Objekt. Die Referenz bedeutet aber nicht gleichzeitig, dass ein Objekt geändert werden kann, wie beispielsweise in C durch Pointer.

Aber ich vermute mal, dass wir gleiches meinen :-)
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

Francesco hat geschrieben:also kurz gesagt: unveränderliche Objecte => neue Namenzuweisung auf das gleich Objekt, bei veränderlichen nicht, oder?
Nein, wenn du unveraenderliche Objekte "aenderst" (z.B. x = 0; x += 1), wird dem gleichen Namen ein neues Objekt zugewiesen. Wenn du ein veraenderliches Objekt aenderst, aendert sich nichts an der Name-Objekt-Zuweisung (okay, ich gehe davon aus, dass du das meinst, aber nur nochmal zur Klarstellung).

@ EyDu:
Es ist relativ offensichtlich, dass der Thread-Ersteller Referenzen im Sinne von C meint. Und sowas gibt's in Python halt nicht.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

EyDu hat geschrieben:
birkenfeld hat geschrieben:Grundsätzlich: Es gibt keine Variablen und Referenzen in Python, sondern Namen und Objekte.
Natürlich gibt es Referenzen:

Code: Alles auswählen

a = "muh"
b = a
Die Namen b und a zeigen beide auf das selbe Objekt. Die Referenz bedeutet aber nicht gleichzeitig, dass ein Objekt geändert werden kann, wie beispielsweise in C durch Pointer.
Es geht um die Terminologie, natürlich kannst du das auch "Referenz" oder "Krapfen" nennen. Nur: "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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

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).
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@sunmountain: Full Ack.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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".
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten