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

Referenz

Beitragvon Francesco » Dienstag 20. Februar 2007, 13:04

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:

Beitragvon nkoehring » Dienstag 20. Februar 2007, 14:07

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 20. Februar 2007, 14:16

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:

Beitragvon nkoehring » Dienstag 20. Februar 2007, 14:25

da muss ich rayo uebrigens absolut recht geben...
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Dienstag 20. Februar 2007, 14:37

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:

Beitragvon rayo » Dienstag 20. Februar 2007, 14:55

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

Beitragvon N317V » Dienstag 20. Februar 2007, 15:04

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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 20. Februar 2007, 15:11

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

Beitragvon birkenfeld » Dienstag 20. Februar 2007, 15:30

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

Beitragvon Francesco » Dienstag 20. Februar 2007, 15:35

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

Beitragvon birkenfeld » Dienstag 20. Februar 2007, 15:39

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

Beitragvon Francesco » Dienstag 20. Februar 2007, 15:47

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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 20. Februar 2007, 16:40

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

Beitragvon mq » Dienstag 20. Februar 2007, 16:58

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

Beitragvon birkenfeld » Dienstag 20. Februar 2007, 17:26

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/

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder