GC не удаляет циклические ссылки в WeakKeyDictionaries?

У меня ситуация, в которой я хотел бы поддерживать отображение одного объекта в другой, пока существует первый объект. Моей первой мыслью было использовать WeakKeyDictionary.

import weakref
import gc

class M:
    pass

w = weakref.WeakKeyDictionary()
m = M()
w[m] = some_other_object
del m
gc.collect()
print w.keys()

В большинстве случаев это работает нормально. Однако в случае, когда some_other_object равно (или имеет ссылку на) m , экземпляр M не будет собираться мусором. (Чтобы увидеть пример, замените some_other_object на m )

Конечно, если бы я сохранил отображение на самом объекте, он был бы удален сборщиком мусора:

import weakref
import gc

class M:
    pass

m = M()
m.circular_reference = m
r = weakref.ref(m)
del m
gc.collect()
print r

Могу ли я добиться результатов второго примера, используя модуль weakref (т.е. без изменения m )?

Другими словами, могу ли я использовать модуль weakref для сопоставления объекта с самим собой (или другим объект, имеющий сильную ссылку на него) и хранить объект в памяти только до тех пор, пока на него есть другие ссылки?

6
задан matthewwithanm 2 June 2011 в 03:21
поделиться