python false 0_python float(0) is 0.0 为什么是 False?
test.py
print id(float(0))
print id(0.0)執(zhí)行結(jié)果:
140494852143304
140494852143328
再來(lái)點(diǎn)例子:
>>> 10000 is 10000
True
>>> a = 10000
>>> b = 10000
>>> a is b
False
>>> a = 1
>>> b = 1
>>> a is b
True
我解釋我上面這個(gè)例子好了:
第一個(gè),兩個(gè)10000 PyIntObject都會(huì)在編譯的時(shí)候就生成,而且因?yàn)樗麄儽痪幾g為了一個(gè)PyCodeObject所以兩個(gè)10000是一樣滴
第二個(gè),當(dāng)你在交互式解釋器這么輸入,a和b 所指向的10000會(huì)被存入兩個(gè)不同的PyCodeObject,所以是不同的
第三個(gè),兩個(gè)1,存入了不同的PyCodeObject,可是CPython有小整數(shù)Cache, 所以不管生成幾次1,都是一樣滴
這些不同取決于交互式解釋器的處理方式,所以測(cè)試這類內(nèi)容,不要用交互式解釋器,它里面做了一些不同滴事情。
下面我們來(lái)解釋問(wèn)者的問(wèn)題
>>> float(0) is 0.0 # 毫無(wú)疑問(wèn),False,后面的0.0位于PyCodeObject中
然后就是對(duì)一個(gè)誤解的解答,
>>> id(0.1)
140307349977328
>>> id(0.2)
140307349977328
這倆哥們ID也一樣,咋回事呢,看來(lái)大家還有興趣,這就涉及到CPython的優(yōu)化了,需要深入源碼,對(duì)于浮點(diǎn)數(shù),Python的設(shè)計(jì)者們預(yù)留了一塊內(nèi)存空間,因?yàn)轭l繁malloc的開銷比較大,在源碼里面是一個(gè)叫free_list的鏈表,生成0.1的時(shí)候把表頭拿出來(lái)用,然后0.1被dealloc后,它的內(nèi)存會(huì)被回收重新加入表頭,0.2來(lái)了,之后的結(jié)果大家都懂的。
貼一段源碼
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);
}
總結(jié)
以上是生活随笔為你收集整理的python false 0_python float(0) is 0.0 为什么是 False?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中的array函数作用_数据
- 下一篇: new file https 找不到路径