在将 python 与 pyroot(一个名为ROOT的 CERN 数据分析包的 python 接口)一起使用时,我遇到了以下奇怪的行为:
print ROOT.TFile(fname).GetListOfKeys()
输出None
,而看似语义等价的代码
f=ROOT.TFile(fname)
print f.GetListOfKeys()
输出预期的<ROOT.THashList object ("THashList") at 0x13f0fa0>
.
虽然这不是我在使用 ROOT 时遇到的第一个错误,但这次我很困惑 python 允许这个错误发生。
我认为不知何故,TFile 对象的引用计数在第一个示例中出错了,并且在实际调用 GetListOfKeys 之前它被删除了。(设置ROOT.TFile.__del__
为一些打印命令后,确实会发生这种情况。)
我看到它的方式,在 ROOT.TFile(fname) 被执行之后,但在 GetListOfKeys() 被调用之前,指向 TFile 对象的指针在堆栈上。因此,引用计数不应为零,并且在 GetListOfKeys() 返回之前不应调用析构函数。
任何人都可以解释为什么会这样吗?
在相关的说明中,有没有办法del
仅仅因为引用计数变为零就禁止 python 隐式地访问我的对象?我尝试了 gc.disable(),并没有改变结果。有没有比将对象附加到一些全局定义的只写列表更优雅的解决方案?