У меня возникла странная проблема при попытке удалить последнюю ссылку на объект.Странное удаление после удаления последней ссылки
Код:
import sys
import weakref
class Ref:
def __init__(self, name):
self.name = name
self.ref = []
def reference(self, obj):
name = obj.name
self.ref.append(
weakref.ref(obj, lambda wref: print('{!r} is dead.'.format(name))))
a = Ref('a')
b = Ref('b')
c = Ref('c')
d = Ref('d')
a.reference(b)
b.reference(c)
c.reference(d)
d.reference(a)
print('reference count before killed:', sys.getrefcount(d.ref[0]()))
del a
print('reference count after killed:', sys.getrefcount(d.ref[0]()))
И выход таков:
reference count before killed: 2
'a' is dead.
reference count after killed: 1547
'd' is dead.
'c' is dead.
Но иногда (это совершенно случайно) я получил только 'd' is dead.
или 'c' is dead.
(но никогда не 'b' is dead.
), или ни этих сообщений вообще.
Так что мой первый вопрос: что это за странный счетчик ссылок 1547
? И откуда оно взялось?
И второе: почему убивающий экземпляр a
создает это случайное «убийство других экземпляров» эффект?
Подсчет 1547, вероятно, является refcount of None, который вызывает слабыйref, как только реферируется. – user2357112
О, это может быть ... спасибо;) –
Вы используете это как скрипт или из интерактивной оболочки? Не гарантируется, будут ли уничтожены объекты, когда выйдет переводчик. – user2357112