PyNumber_Float如何处理已经是float的参数?

时间:2014-12-10 08:24:33

标签: type-conversion python-c-api

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);

这里发生了什么?

  • 它只是返回相同的指针吗?
  • 首先递增引用计数然后返回相同的指针吗?
  • 或者是否返回指向新PyObject的指针?

对于生成其他基元(例如Long,String,List,Dict等)的等效C-API调用,行为是否保证相同?

最后,文件应该澄清这种情况吗?提交doc-bug是否合理?

1 个答案:

答案 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()

的应用程序