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

 天天写程序 发布于 2022-12-25 19:02

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有