Wann existieren die Objekte nicht mehr?

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
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Code: Alles auswählen

class A:
    def __init__(self):
        self.a ="a"
    def more(self):
        a = A()
        a.a = self.a + "a"
        return a

a = A()
b = a.more().more().more()
Das Beispiel hat eig in der Form keine Praxisrelevanz, allerdings zeigt es mein Problem grad schön

a.more() ergibt eine neue Instanz von A.
a.more().more() ebenfalls

Diese beiden werden aber keiner Variablen zugewiesen.
Wann hören diese Objekte auf zu existieren?
(Oder existieren sie jemals?)
BlackJack

@ravenheart: Natürlich existieren sie, sonst könntest Du ja die Methode darauf nicht aufrufen. Wie lange sie existieren ist abhängig von der Python-Implementierung.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du musst davon ausgehen dass sie fuer immer existieren wie in jeder anderen Sprache mit GC auch.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

ravenheart hat geschrieben:Wann hören diese Objekte auf zu existieren?
Wenn du den PC ausschaltest. :D
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

In der Regel werden die Objekte zur gargabe collection freigegeben, sobald sie "out of scope" gehen, also der Referenzzähler bei Null angelangt ist.

http://docs.python.org/library/sys.html#sys.getrefcount
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@syntor:

Wobei man natürlich erwähnen sollte, dass Freigabe für den GC != promptes Enfernen aus dem Speicher. Denn bekanntlich sammelt der GC von CPython die Objekte aus Optimierungsgründen generationsweise ein. Bei anderen Implementierungen mag das Verhalten zudem noch ganz anders aussehen. Man kann sich also nicht darauf verlassen, dass der Speicher schon in dem Moment freigegeben wird, wo das Objekt sozusagen gerade "out of scope" gegangen ist. Eher ist dies der frühestmögliche Zeitpunkt für das Einsammeln. Im "schlimmsten" Fall kann es sogar sein, dass die Speicherfreigabe nie bzw erst mit Beenden des Interpreters erfolgt.

Bei einer Sprache mit automatischer Speicherbereinigung sollte man daher gar nicht erst auf die Idee kommen, jedwedes Verhalten des GCs mit einzuplanen. Wenn man denn unbedingt damit "konkurrieren" will, dann möchte man sich vielleicht mal das Modul gc anschauen, das Zugriff auf das Interface des Collectors bietet.

Ich glaube aber, man muss bei dieser Frage prinzipiell unterscheiden zwischen "Existenz" im Sinne von "Speicherbelegung" oder "Existenz" im Sinne von "Erreichbarkeit". Hier nehme ich an, dass eher Letzteres gemeint war.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Eine gleichwertige Frage ist: Wann geht im Kühlschrank das Licht aus?

Ist die Tür auf, ist Licht an. Wenn man die Tür zu macht, sieht man das Licht nicht mehr. Ist es aus? Man weiß es nicht. Ein "vernünftiger" Kühlschrank würde das Licht aus Effizienzgründen sicherlich sofort löschen, doch es könnte auch weiter brennen oder vielleicht erst später ausgehen, um eine Energiesparlampe nicht zu überstrapazieren oder für ein besseres Mikroklima zu sorgen oder was weiß ich. Entscheidend für mich ist: Wenn die Tür zu ist, brennt es für mich nicht mehr (und erleuchtet die dunkle Küche in der Nacht), ist damit per definitionem aus (denn die Küche ist dunkel).

Genauso ist es auch mit Objekten unter einem Garbage Collector. Kann ich sieh nicht mehr sehen (erreichen) sind sie per definitionem weg - egal ob ihr Speicherplatz schon wiederverwendet wurde oder nicht.

Stefan
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

@sma man weiß doch ob im kühlschrank das lichtausgeht, wenn man die Tür schließt drückt die gegen eine schalter und das licht geht aus, drückt man mit der hand dagegen geht es auch aus. :D (Wer's mir nicht glaubt kann's ja selber ausprobieren...)

EDIT: 300 Beitrag
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Py-Prog hat geschrieben:@sma man weiß doch ob im kühlschrank das lichtausgeht, wenn man die Tür schließt drückt die gegen eine schalter und das licht geht aus, drückt man mit der hand dagegen geht es auch aus. :D (Wer's mir nicht glaubt kann's ja selber ausprobieren...)

EDIT: 300 Beitrag
Vielleicht in deinem Kühlschrank! Du hast das Beispiel von sma nicht verstanden, oder?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ist's bei deinem Kühlschrank den nicht so?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
lunar

@Py-Prog: Nein, in meinem Kühlschrank ist das nicht so. Dessen Licht wird nämlich von einem Hamster in einem Laufrad produziert, und der hat so viel Spaß am Laufen, dass er immer weiter läuft, auch wenn die Tür zu ist. Er ist übrigens top-fit, dieser Hamster. Blöd ist nur, dass man nachts kein Licht im Kühlschrank hat, weil dann der Hamster schläft.

Im Ernst, das Licht im Kühlschrank war eine Analogie, überlege doch mal, was sma damit sagen wollte (Hinweis: Es geht nicht um Kühlschränke, und schon gar nicht darum, ob das Licht jetzt tatsächlich ausgeht oder nicht).
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

lunar hat geschrieben:@Py-Prog: Nein, in meinem Kühlschrank ist das nicht so. Dessen Licht wird nämlich von einem Hamster in einem Laufrad produziert, und der hat so viel Spaß am Laufen, dass er immer weiter läuft, auch wenn die Tür zu ist. Er ist übrigens top-fit, dieser Hamster. Blöd ist nur, dass man nachts kein Licht im Kühlschrank hat, weil dann der Hamster schläft.

Im Ernst, das Licht im Kühlschrank war eine Analogie, überlege doch mal, was sma damit sagen wollte (Hinweis: Es geht nicht um Kühlschränke, und schon gar nicht darum, ob das Licht jetzt tatsächlich ausgeht oder nicht).
Jetzt weiß ich auch warum der Kühlschrank manchmal so laut ist. Ich sollte mal das Laufrad ölen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

lunar hat geschrieben:Blöd ist nur, dass man nachts kein Licht im Kühlschrank hat, weil dann der Hamster schläft.
Hamster sind aber nachtaktiv, der muss sich dir unter falscher Identität untergemogelt haben :twisted:
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Tag ist, wenn der Hamster läuft.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

lunar hat geschrieben:@Py-Prog: Nein, in meinem Kühlschrank ist das nicht so. Dessen Licht wird nämlich von einem Hamster in einem Laufrad produziert, und der hat so viel Spaß am Laufen, dass er immer weiter läuft, auch wenn die Tür zu ist. Er ist übrigens top-fit, dieser Hamster. Blöd ist nur, dass man nachts kein Licht im Kühlschrank hat, weil dann der Hamster schläft.
Jetzt musst du blos noch mit Ecosia 'googeln' und dann bist du der umweltfreundlichste Programmieren. :lol:
lunar hat geschrieben: Im Ernst, das Licht im Kühlschrank war eine Analogie, überlege doch mal, was sma damit sagen wollte (Hinweis: Es geht nicht um Kühlschränke, und schon gar nicht darum, ob das Licht jetzt tatsächlich ausgeht oder nicht).
Also wenn ich auf ein Objekt zugreifen kann existiert es für mich, wenn es 'existiert' (im RAM) und ich darauf nicht zugreifen kann existiert es für mich nicht. Das ist meine meinung, aber ob sma das damit sagen wollte ...
cofi hat geschrieben:Hamster sind aber nachtaktiv, der muss sich dir unter falscher Identität untergemogelt haben :twisted:
Wie ein Hacker jemanden einen Trojaner untermogelt.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Wir wissen doch gar nicht, ob das Objekt existiert bis wir nachschauen... verfälschen wir damit nicht das Resultat? :D (Schrödinger lässt grüssen) Obwohl, In Python geht das z.B. via Descriptor-protocol.

@ravenheart: Anstelle noch weiteren Unsinn zu schreiben, wäre es doch nützlicher zu wissen, ob denn deine Frage jetzt beantwortet ist.

@snafu: Ja klar, da hast du recht - und ich tendiere auch zu letzterem :D
Antworten