Python C API:省略变量赋值会导致意外行为

时间:2014-08-25 13:38:15

标签: python python-2.7 root-framework pyroot

使用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()返回之前不应调用析构函数。

有人能说清楚为什么会这样吗?

在相关的说明中,是否有一种方法可以隐式地禁用python del我的对象只是因为引用计数变为零?我尝试了gc.disable(),并没有改变结果。是否有比将对象附加到某些全局定义的只写列表更优雅的解决方案?

0 个答案:

没有答案