Python–常用模块脚本–weakref

文章介绍了Python的weakref模块,用于创建弱引用,防止垃圾回收器过早回收对象。弱引用在内存管理中起到关键作用,如WeakValueDictionary存储对象的弱引用,在无强引用后自动清理。此外,讨论了对象销毁时的回调函数以及Python的驻留机制,如共享字符串字面量和小整数对象的优化处理。
摘要由CSDN通过智能技术生成

#.weakref弱引用

文章目录

import weakref
class Cheese:
    """各种奶酪"""
    def __init__(self, kind):
        self.kind = kind  # 奶酪种类
    def __repr__(self):
        return 'Cheese(%r)' % self.kind

# WeakValueDictionary类实现的是一种可变映射,里面的值是对象的弱引用
stock = weakref.WeakValueDictionary()
catalog = [Cheese('A'), Cheese('B'), Cheese('C'), Cheese('D'), ]
for cheese in catalog:
    stock[cheese.kind] = cheese
print(sorted(stock.keys()))
del catalog
print(sorted(stock.keys()))  # 删除catalog之后,还有'D',说明还存在一个强引用,那就是cheese保存了循环中的最后一个值
del cheese
print(sorted(stock.keys()))  # 删除cheese后,所有强引用都没了,WeakValueDictionary也变为空了

# set实例和用户自定义类型可以作为所指对象
# int和tuple实例不能作为弱引用的目标,甚至是子类也不行

# 对象销毁时回调函数
class TestObj:
    pass
def test_func(reference):
    print('Hello from Callback function!')
    print(reference, 'This weak reference is no longer valid')
a = TestObj()
# 建立一个a的弱引用
x = weakref.ref(a, test_func)
print(x())
del a

# 共享字符串字面量是一种优化措施,称为驻留(interning)
t = (1, 2)
t2 = t[:]
t3 = tuple(t)
print(t3 is t)
print(t2 is t)
# 对于整数对象,如果其值处于[-5,256]的闭区间内,则值相同的对象是同一个对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柴寺仓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值