写装饰器的时候突然想到
1
ClericPy 2020-02-21 12:49:29 +08:00
看情况吧, 不知道你具体怎么用的, 可以试试: 丢到 WeakSet 里, 看没有引用了以后这个 set 空了没有. 不过看 set 的时候要确保是在程序退出时候执行栈的最外层, 比如试试 atexit 或者丢到这个函数外层 class 的 __del__ 里
|
2
PTLin 2020-02-21 13:50:51 +08:00
只要有名字绑定到一个对象上就不会被 CG
def bar(func): def wrapper(*args,**kwargs): print(func.__name__) func() return wrapper @bar def foo(): print('foo') 比如这段代码,foo 被 bar 装饰之后之际上调用的是 wrapper,在 wrapper 里 func 是自由变量,上面这个代码上原始的 foo 存在 foo.__closure__[0].cell_contents 这个名字里,所以原始的 foo 还有名字绑定不会被 CG |
3
chenstack 2020-02-21 18:19:19 +08:00
除非在函数定义的作用域中把引用删掉了,比如
import weakref def fn(): print('I am alive') fn_ref = weakref.ref(fn) print(fn_ref()) del fn print(fn_ref()) # 变成 None 了 |