2.1. 浮点对象
浮点对象是“定长对象”。
2.1.1. Python中的创建
Python中浮点对象创建最重要的方法为PyFloat_FromDouble,如下Python语句最终会调用到PyFloat_FromDouble:
![](https://img.haomeiwen.com/i2509688/9f286d6055a7d5e0.png)
2.1.2. PyFloat_FromDouble的C调用栈
词法解析,最终调到PyFloat_FromDouble,调用顺序如下:
![](https://img.haomeiwen.com/i2509688/7732629a257c98dc.png)
2.1.3. PyFloat_FromDouble的C源码
![](https://img.haomeiwen.com/i2509688/a0d5b226ebe00cbb.png)
可以看到:
浮点对象的C数据结构,所以Python中的浮点对象,实际上是C中的double。
![](https://img.haomeiwen.com/i2509688/9ca7ea316ae86bab.png)
采用浮点对象缓冲池
![](https://img.haomeiwen.com/i2509688/23db51c2e03c6d88.png)
float_dealloc和PyFloat_FromDouble方法针对free_list和numfree的操作构成了Python的浮点对象缓冲池技术。采用链表,值得注意的是Py_TYPE(op),在此处被当做next指针。缓冲池大小有上限,Python3中为100。
PyObject_INIT
因为是定长对象,所以调用PyObject_INIT方法,与PyObject_INIT_VAR方法相比,只是少调用Py_SIZE(op) = (size)
2.2. 浮点对象的特性
2.2.1. 数值计算
![](https://img.haomeiwen.com/i2509688/3bd4ae7771bd5564.png)
浮点对象的数值计算由float_as_number定义:
![](https://img.haomeiwen.com/i2509688/30a3a9917816dc1b.png)
2.2.2. to string
![](https://img.haomeiwen.com/i2509688/4acc0f6cd910da46.png)
2.2.3. hash
![](https://img.haomeiwen.com/i2509688/bf172958b2d3c6ca.png)
2.2.4. 比较
![](https://img.haomeiwen.com/i2509688/4a97c2144b65cc8e.png)
2.2.5. 内置方法
![](https://img.haomeiwen.com/i2509688/36d50b94f1bedac3.png)
2.2.6. 内置属性
![](https://img.haomeiwen.com/i2509688/164723d0442d69d3.png)
2.3 参考
Python源码剖析
本文作者:whj0709
本文为云栖社区原创内容,未经允许不得转载。
网友评论