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