6

在将 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(),并没有改变结果。有没有比将对象附加到一些全局定义的只写列表更优雅的解决方案?

4

0 回答 0