【python】对象释放,弱引用weaker.ref

class A:
    def __del__(self):
        print("in__del__")

>>> a = A()
>>> a = None
in__del__

>>> f = A()
>>> g = f
>>> f = None
>>> g = 1
in__del__

#当实例没有被指向时,既引用记数等于0时就会被释放
    #引用    a-->node
    #弱引用  a2-->
    #弱引用并不会整增加引用记数,所以a = None时,node就会被释放


class A:
    def __del__(self):
        print("in__del__")
>>> import weakref
>>> q = A()
>>> q2 = weakref.ref(q)     #弱引用
>>> q3 = q2()               #弱引用变为引用
>>> q3 is q
True
>>> del q
>>> del q3
in__del__
 #head-->n1-->n2-->n3      
 #head<--n1<--n2<--n3    #把这行变为弱引用,当head = None时,整条链条都会被释放


import weakref
class Node:
    def __init__(self, data):
        self.data = data
        self._left = None
        self.right = None

    def add_right(self, node):
        self.right = node
        node._left = weakref.ref(self)

    @property
    def left(self):
        return self._left()

    def __str__(self):
        return 'Node:<%s>' % self.data

    def __del__(self):
        print('in __del__: delete %s' % self)

def create_linklist(n):
    head = current = Node(1)
    for i in range(2, n + 1):
        node = Node(i)
        current.add_right(node)
        current = node
    return head

head = create_linklist(1000)
print(head.right, head.right.left)
input()
head = None

import time
for _ in range(1000):
    time.sleep(1)
    print('run...')
input('wait...')

猜你喜欢

转载自blog.csdn.net/qq_38065133/article/details/82356187