Seite 1 von 1

Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 19:45
von ayJay

Code: Alles auswählen

class test:
  pass

a = test()
b = a
Ist es nach obiger Codesequenz möglich, das bestehende Objekt auf None zu setzen, wenn ich nur b habe?

Code: Alles auswählen

b = None
oder

Code: Alles auswählen

del(b)
hilft ja beides nicht. Ich möchte sowas wie *b = None (in C). Nach ein bisschen googeln und meinem Verständnis von Python glaube ich, dass das nicht geht, aber vielleicht kann mir jemand das bestätigen, oder noch besser, eine Lösung geben.

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 20:08
von Hyperion

Code: Alles auswählen

In [1]: class Test(object):
   ...:     pass
   ...:

In [2]: a = Test()

In [3]: a
Out[3]: <__main__.Test object at 0x01098350>

In [4]: b = a

In [5]: b
Out[5]: <__main__.Test object at 0x01098350>

In [6]: b is a
Out[6]: True

In [7]: b = None

In [8]: b

In [9]: a
Out[9]: <__main__.Test object at 0x01098350>
qed.

Ist ja auch klar. "a" ist in dem Scope natürlich noch gültig - wäre ja Wahsinn, wenn man aus einem beliebigen Scope heraus ein Objekt löschen könnte, das woanders noch gebunden ist!

Die Frage ist eher: Wozu willst Du das haben. Imho ist liegt der Fehler bei Deinem Design.

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 20:20
von Hyperion
Vielleicht macht es das noch verständlicher:

Code: Alles auswählen

In [10]: l = [Test(), Test(), Test()]

In [11]: l
Out[11]:
[<__main__.Test object at 0x01098E30>,
 <__main__.Test object at 0x01098E90>,
 <__main__.Test object at 0x01098E70>]

In [12]: def bad_function(obj):
   ....:     obj = None
   ....:
   ....:

In [13]: bad_function(l[0])

In [14]: l
Out[14]:
[<__main__.Test object at 0x01098E30>,
 <__main__.Test object at 0x01098E90>,
 <__main__.Test object at 0x01098E70>]
Beim Aufruf der Funktion bad_function() wird das Objekt, das ich aus der Liste hole, an den lokalen Namen "obj" gebunden. Den Namen binde ich mit None letztlich neu. Aber wenn ich hier dadurch das Objekt löschen könnte, ohne Zugriff auf das Listenobjekt zu haben, wäre ja übelste Nebeneffekte möglich.

(@Regulars: Bitte korrigiert mich, wenn das Bullshit war :-) )

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 20:28
von ayJay
Genau das war auch mein Verständnis, wie's läuft. Ähnlichen Code hab ich auch ausprobiert, ich dachte nur, dass es in den Tiefen von Python doch noch einen Weg gibt.

Im Design wirklich brauchen tue ich es nicht, ist jetzt halt mit einem Funktionsaufruf mehr gelöst.

Danke für die Niederschrift deiner Versuche für die Nachwelt :!:

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 20:34
von cofi
Man sollte vielleicht noch erwaehnen, dass die "Variablen" nicht mehr als Namen sind, die Objekte sind davon unabhaengig. Post-its sind da die beste Metapher.

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 20:49
von ayJay
Post-It im Sinne von "ich pappe ein Post-It mit dem Text "meinKühlschrank" auf einen "Kühlschrank" und nehme es dann wieder ab", um folgenden Code zu "metaphern"?

Code: Alles auswählen

meinKühlschrank = Kühlschrank()
del(meinKühlschrank)
Dann macht die Metapher auch schön deutlich, dass ich auch zig Post-Its mehr draufkleben und wieder abnehmen kann, ohne irgendwas an dem Kühlschrank zu ändern. Daumen hoch!

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 21:18
von /me
ayJay hat geschrieben:Post-It im Sinne von "ich pappe ein Post-It mit dem Text "meinKühlschrank" auf einen "Kühlschrank" und nehme es dann wieder ab", um folgenden Code zu "metaphern"?

Code: Alles auswählen

meinKühlschrank = Kühlschrank()
del(meinKühlschrank)
Dann macht die Metapher auch schön deutlich, dass ich auch zig Post-Its mehr draufkleben und wieder abnehmen kann, ohne irgendwas an dem Kühlschrank zu ändern. Daumen hoch!
Und wenn irgendwann mal kein Zettel mehr dranpappt kommt die Müllabfuhr (Garbage Collection) und karrt das Ding weg.

Re: Variable "dereferenzieren"

Verfasst: Montag 24. Mai 2010, 22:41
von Leonidas
@Hyperion: Ja, du hast schon recht. Ich wollt grad noch was wegen der Nebeneffekte anmerken, dann dacht ich mir dass ich den kleinen Aspberger sein lasse und das einfach so als "korrekt" bestätige. P.S.: Jemand der 2392 Posts hat würde ich als Regular ansehen, kannst dich nicht rausreden hier nur zu Besuch zu sein :P
/me hat geschrieben:
ayJay hat geschrieben:Post-It im Sinne von "ich pappe ein Post-It mit dem Text "meinKühlschrank" auf einen "Kühlschrank" und nehme es dann wieder ab", um folgenden Code zu "metaphern"?

Code: Alles auswählen

meinKühlschrank = Kühlschrank()
del(meinKühlschrank)
Dann macht die Metapher auch schön deutlich, dass ich auch zig Post-Its mehr draufkleben und wieder abnehmen kann, ohne irgendwas an dem Kühlschrank zu ändern. Daumen hoch!
Und wenn irgendwann mal kein Zettel mehr dranpappt kommt die Müllabfuhr (Garbage Collection) und karrt das Ding weg.
Und jetzt noch zyklische Referenzen und Weakrefs in die Metapher integrieren :twisted:

Re: Variable "dereferenzieren"

Verfasst: Dienstag 25. Mai 2010, 03:01
von derdon
Ich finds eh schon komisch genug, dass die Müllabfuhr Kühlschränke einsammelt :D

Re: Variable "dereferenzieren"

Verfasst: Dienstag 25. Mai 2010, 08:05
von Hyperion
Leonidas hat geschrieben:P.S.: Jemand der 2392 Posts hat würde ich als Regular ansehen, kannst dich nicht rausreden hier nur zu Besuch zu sein :P
*g* Hey, es gibt ja auch Dauergäste ;-) aber ich will mich mal nicht mit Erdös vergleichen :-D

Mein Wissensstand bezüglich Python hat sich in den letzten 2 - 3 Jahren dank dieses Forums zwar immens erhöht, aber speziell bei solch Sprach theoretischen Dingen habe ich noch viele Defizite denke ich mal. Daher wollte ich hier zunächst eher vorsichtig auftreten.

Re: Variable "dereferenzieren"

Verfasst: Dienstag 25. Mai 2010, 15:34
von cofi
/me hat geschrieben:Und wenn irgendwann mal kein Zettel mehr dranpappt kommt die Müllabfuhr (Garbage Collection) und karrt das Ding weg.
Hm. Nicht so ganz, Listen benennen ja ihre Elemente nicht, halten sie aber fest, also vielleicht noch Seile dazunehmen? 8)