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

2024-06-10 00:36:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用python和pyroot(CERN名为ROOT的数据分析包的python接口)时,我遇到了以下奇怪的行为:

print ROOT.TFile(fname).GetListOfKeys()

输出None,而看似语义等价的代码

f=ROOT.TFile(fname)
print f.GetListOfKeys()

输出所需的<ROOT.THashList object ("THashList") at 0x13f0fa0>。你知道吗

虽然这并不是我在使用ROOT时遇到的第一个bug,但这次我对python允许这个bug发生感到非常困惑。你知道吗

我估计在第一个示例中,TFile对象的引用计数会出错,并且在实际调用GetListOfKeys之前它会被删除。(将ROOT.TFile.__del__设置为某个打印命令后,确实会发生这种情况。)

在我看来根.TFile(fname)执行,但在调用GetListOfKeys()之前,指向TFile对象的指针位于堆栈上。因此,在GetListOfKeys()返回之前,引用计数不应为零,并且不应调用析构函数。你知道吗

有人能解释一下为什么会这样吗?你知道吗

另一方面,有没有办法仅仅因为引用计数变为零就禁止python隐式地del我的对象?我试过了gc.禁用(),结果没有改变。有没有比将对象附加到某个全局定义的只写列表更优雅的解决方案?你知道吗


Tags: 对象none语义rootfnamebugcern计数