日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python false 0_python float(0) is 0.0 为什么是 False?

發(fā)布時(shí)間:2024/9/30 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python false 0_python float(0) is 0.0 为什么是 False? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。