生成器函数返回的生成器对象是否会保留对函数对象的引用?换句话说,是否可以实现magic_fn
来实现这一点:
>>> def gen():
... yield 1
... yield 2
...
>>> gen.attr = 'potato'
>>> g = gen()
>>> del gen
>>> next(g)
1
>>> magic_fn(g, 'attr')
'potato'
生成器有一个对代码对象(
g.gi_code
)、帧(g.gi_frame
)和名称(g.__name__
)的引用。代码对象甚至具有与gen.__code__
相同的内存地址。但是,假设它尚未被垃圾回收,我找不到访问
gen.__dict__
的方法。这是可能的吗,还是链接在生成器创建时就已经丢失了?
Dummy
上实现一个打印'goodbye'的__del__
来看到它被收集。你能否对weakref.ref
的使用方式和工作原理进行更详细的解释? - wim