python false 0_python float(0) is 0.0 为什么是 False?
test.py
print id(float(0))
print id(0.0)執行結果:
140494852143304
140494852143328
再來點例子:
>>> 10000 is 10000
True
>>> a = 10000
>>> b = 10000
>>> a is b
False
>>> a = 1
>>> b = 1
>>> a is b
True
我解釋我上面這個例子好了:
第一個,兩個10000 PyIntObject都會在編譯的時候就生成,而且因為他們被編譯為了一個PyCodeObject所以兩個10000是一樣滴
第二個,當你在交互式解釋器這么輸入,a和b 所指向的10000會被存入兩個不同的PyCodeObject,所以是不同的
第三個,兩個1,存入了不同的PyCodeObject,可是CPython有小整數Cache, 所以不管生成幾次1,都是一樣滴
這些不同取決于交互式解釋器的處理方式,所以測試這類內容,不要用交互式解釋器,它里面做了一些不同滴事情。
下面我們來解釋問者的問題
>>> float(0) is 0.0 # 毫無疑問,False,后面的0.0位于PyCodeObject中
然后就是對一個誤解的解答,
>>> id(0.1)
140307349977328
>>> id(0.2)
140307349977328
這倆哥們ID也一樣,咋回事呢,看來大家還有興趣,這就涉及到CPython的優化了,需要深入源碼,對于浮點數,Python的設計者們預留了一塊內存空間,因為頻繁malloc的開銷比較大,在源碼里面是一個叫free_list的鏈表,生成0.1的時候把表頭拿出來用,然后0.1被dealloc后,它的內存會被回收重新加入表頭,0.2來了,之后的結果大家都懂的。
貼一段源碼
static void
float_dealloc(PyFloatObject *op)
{
if (PyFloat_CheckExact(op)) {
op->ob_type = (struct _typeobject *)free_list;
free_list = op;
}
else
op->ob_type->tp_free((PyObject *)op);
}
總結
以上是生活随笔為你收集整理的python false 0_python float(0) is 0.0 为什么是 False?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的array函数作用_数据
- 下一篇: 润乾报表列太多导致渲染速度慢_报表自动化