PyNumber_Float(here)的文档没有指定如果传入指向另一个浮点数的PyObject *会发生什么。
e.g。 PyObject * l = PyLong_FromLong(101); PyObject * outA = PyNumber_Float(l);
outA将指向新创建的float PyObject (或者如果已经存在具有该值的那个,我认为它将指向那个并且仅增加引用计数器)
然而,
PyObject* f = PyFloat_FromDouble( 1.1 );
PyObject* outB = PyNumber_Float(f);
这里发生了什么?
对于生成其他基元(例如Long,String,List,Dict等)的等效C-API调用,行为是否保证相同?
最后,文件应该澄清这种情况吗?提交doc-bug是否合理?
答案 0 :(得分:0)
感谢dev IRC频道上的haypo,以下测试显示它返回相同的对象,引用计数器递增:
>>> x=1.1
>>> y=float(x)
>>> y is x, sys.getrefcount(x)-1, sys.getrefcount(y)-1
(True, 2, 2)
>>> y+=1
>>> y is x, sys.getrefcount(x)-1, sys.getrefcount(y)-1
(False, 1, 1)
注意:解释为什么引用计数太高here
注意:x是y比较内存地址," x是y"与" id(x)== id(y)"
当然,某些赋值运算符优化可能会绕过float()
的应用程序