不懂就问,走火入魔了,函数对象会被 GC 吗

2020-02-21 12:43:38 +08:00
 Marinej

写装饰器的时候突然想到

3068 次点击
所在节点    Python
4 条回复
ClericPy
2020-02-21 12:49:29 +08:00
看情况吧, 不知道你具体怎么用的, 可以试试: 丢到 WeakSet 里, 看没有引用了以后这个 set 空了没有. 不过看 set 的时候要确保是在程序退出时候执行栈的最外层, 比如试试 atexit 或者丢到这个函数外层 class 的 __del__ 里
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
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 了
Marinej
2020-02-22 18:59:17 +08:00
@PTLin 嗯,自由变量还是被绑定的,谢谢解答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646326

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX