0%

Python之Weak Ref弱引用

这里介绍Python的weak ref弱引用

abstract.png

创建弱引用

Python 中当一个对象没有引用指向自己后,即会被gc回收。但 weak ref弱引用 不会妨碍所指对象被当作垃圾回收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import weakref

num1 = {22,44}

# 创建弱引用对象
num1_weak_ref = weakref.ref(num1)

print(f"num1 -->> {num1}")
# 当对象存在时,调用弱引用对象后可以获取到该对象
print(f"num1_weak_ref() -->> {num1_weak_ref()}")

# 删除变量 对 对象的引用。由于现在该对象没有其他引用,无法再次获得。故gc会对该对象进行回收
del num1

# 当对象不存在时,调用弱引用对象后会返回None
print(f"num1_weak_ref() -->> {num1_weak_ref()}")

figure 1.png

finalize方法

weakref模块的finalize方法在变量所指向的对象上注册一个回调函数,并指定回调函数的实参。该方法会返回一个终结器对象。当对象要被gc回收时,其会自动使用指定实参调用指定的回调函数。此外,可通过终结器对象的alive属性 可判断对象是否存活。由于,终结器对象持有的是对象的弱引用,故不会影响对象被gc回收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
names1 = {"Tony","Amy"}
names2 = names1

# 在names1指向的对象上注册回调函数,并指定回调函数的实参。
ender =weakref.finalize(names1, lambda msg: print("gg:",msg), "Bye~~")
print(f"对象是否存活 #1: {ender.alive}")

print("\n---------------after del names1---------------")
# 删除变量 对 对象的引用
del names1
print(f"对象是否存活 #2: {ender.alive}")
print(f"names 2 ---->>>> {names2}")

print("\n---------------after del names2---------------")
# 删除变量 对 对象的引用
del names2
print(f"对象是否存活 #3: {ender.alive}")

figure 2.png

参考文献

  1. Python编程·第3版:从入门到实践 Eric Matthes著
  2. Python基础教程·第3版 Magnus Lie Hetland著
  3. 流畅的Python·第1版 Luciano Ramalho著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝