Diskuze: Rušení referencí
V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.
Objekt bude zrušený až ve chvíli, kdy už na něj nebudou existovat žádné reference.
import weakref
class Reference():
_count = 0
def __init__(self):
print("Začátek objektu.")
Reference._count += 1
self.number = Reference._count
def __del__(self):
print("Konec objektu.")
if Reference: Reference._count -= 1
def __repr__(self):
return "Ref: {}".format(self.number)
@staticmethod
def get_count():
return Reference._count
if __name__ == "__main__":
r1 = Reference()
r2 = Reference()
r3 = Reference()
assert Reference.get_count() == 3, "Počet instancí 3, což je v pořádku"
del(r3)
assert Reference.get_count() == 2, "Počet instancí 2, také dobře."
seznam = [weakref.ref(r1), weakref.ref(r2)]
print([i() for i in seznam])
del(r2)
print([i() for i in seznam])
assert Reference.get_count() == 1, "Já bych chtěl, prosím, jen r1 :)"
Ale abych Ti zamotal hlavu, zamysli se nad následujícím příkladem.
import weakref
import gc
class Reference():
_count = 0
def __init__(self):
print("Začátek objektu.")
Reference._count += 1
self.number = Reference._count
def __del__(self):
print("Konec objektu %s" % self.number)
if Reference: Reference._count -= 1
def __repr__(self):
return "Ref: {}".format(self.number)
@staticmethod
def get_count():
return Reference._count
if __name__ == "__main__":
gc.disable() # kvuli pythonu < 3.4
r1 = Reference()
r2 = Reference()
r3 = Reference()
r1.next = r2
r2.next = r3
r3.next = r1
w1 = weakref.ref(r1)
del(r1)
del(r2)
del(r3)
print("prave jsem odstranil reference")
r4 = Reference()
r5 = Reference()
w1().next = None
Mimochodem, Python 3.3 a 3.4 se budou chovat naprosto odlišně kvůli změně v GC.
Ahoj,
díky za ten tip, vypadá to, že dělá přesně to, co jsem potřeboval. I
když teď musím ještě prozkoumat, co to vlastně použití weakref znamená
a jak se s nimi dělá.
Co se týče toho druhého kódu, tak si buď jistý, že mi právě teď
nezamotáš hlavu víc než to víno, co jsem za večer vypil
Slibuji, že se nad ním důkladněji zamyslím ráno, i když ti musím
škodolibě sdělit, že mám python 3.3, takže jsem z obliga
Líbí se mi ale ta technika, kterou jsi použil. Skoro se mi chce říct, že
je to dobré kung fu...
r1.next = r2
r2.next = r3
r3.next = r1
Po sem mi je vše jasné (za předpokladu, že gc je garbage collector), nicméně ta další část mi už tak jasná není. Hlavně proto, že nevím, co dělají ty závorky u posledního řádku:
w1().next = None #w1 by mělo být právě teď None nebo nedefinované, ne?
Tak a teď k té druhé části.
Chová se nečekaně, i v 3.3. Opravdu to není None, jak jsem myslel. Ve
skutečnosti zůstala zachovaná weakref, i když by podle mne neměla.
Takže teď bych poprosil o vysvětlení
retain cycle
GC jsem vypnul, aby se 3.3 chovala stejně jako 3.4 (3.3 je verze, která se
chová špatně, 3.4 už je opravená)
https://docs.python.org/…rary/gc.html?…
přepni si dokumentaci na verzi 3.3
Počkej,
tím chceš naznačit, že to je žádoucí chování? Já myslel, že to byl
nějaký vtipný bug, odstraněný v pythonu od verze 3.
Zobrazeno 7 zpráv z 7.