Variable "dereferenzieren"

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.
Antworten
ayJay
User
Beiträge: 17
Registriert: Dienstag 20. Mai 2008, 01:10

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.
Wars don't determine who's right - only who's left
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ayJay
User
Beiträge: 17
Registriert: Dienstag 20. Mai 2008, 01:10

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 :!:
Wars don't determine who's right - only who's left
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
ayJay
User
Beiträge: 17
Registriert: Dienstag 20. Mai 2008, 01:10

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!
Wars don't determine who's right - only who's left
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

@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:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich finds eh schon komisch genug, dass die Müllabfuhr Kühlschränke einsammelt :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

/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)
Antworten