国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python解惑之整數比較詳解

2020-02-23 04:36:11
字體:
來源:轉載
供稿:網友

前言

在 Python 中一切都是對象,毫無例外整數也是對象,對象之間比較是否相等可以用==,也可以用is。

==和is操作的區別是:

is比較的是兩個對象的id值是否相等,也就是比較倆對象是否為同一個實例對象,是否指向同一個內存地址。 ==比較的是兩個對象的內容是否相等,默認會調用對象的__eq__()方法。

清楚is和==的區別之后,對此也許你有可能會遇到下面的這些困惑,于是就有了這樣一篇文章,試圖把Python中一些隱晦的東西趴出來,希望對你有一定的幫助。

我們先來看兩段代碼:

片段一:

>>> a = 256>>> b = 256>>> a == bTrue>>>

片段二:

>>> a = 256>>> b = 256>>> a is bTrue>>>

在交互式命令行執行上面兩段代碼,代碼片段一中的a==b返回True很好理解,因為兩個對象的值都是256,對于片段二,a is b也返回True,這說明a和b是指向同一個對象的,可以檢查一下他們的id值是否相等:

>>> id(a)8213296>>> id(b)8213296>>> 

結果證明他倆的確是同一個對象,指向的是同一個內存地址。那是不是所有的整數對象只要兩個對象的值(內容)相等,它們就是同一個實例對象呢?換句話說,對于整數對象只要==返回True,is操作也會返回True嗎?

帶著這個問題來看下面這兩段代碼:

片段一:

>>> a = 257>>> b = 257>>> a == bTrue>>>

片段二:

>>> a = 257>>> b = 257>>> a is bFalse>>>

對于257,a is b返回的竟然是False,結果可能在你的意料之中,也有可能出乎你的意料,但不管怎么,我們還是要刨根問底,找出問題的真相。

解惑一

出于對性能的考慮,Python內部做了很多的優化工作,對于整數對象,Python把一些頻繁使用的整數對象緩存起來,保存到一個叫small_ints的鏈表中,在Python的整個生命周期內,任何需要引用這些整數對象的地方,都不再重新創建新的對象,而是直接引用緩存中的對象。Python把這些可能頻繁使用的整數對象規定在范圍[-5, 256]之間的小對象放在small_ints中,但凡是需要用些小整數時,就從這里面取,不再去臨時創建新的對象。因為257不再小整數范圍內,因此盡管a和b的值是一樣,但是他們在Python內部卻是以兩個獨立的對象存在的,各自為政,互不干涉。

弄明白第一個問題后,我們繼續在Python交互式命令行中寫一個函數,再來看下面這段代碼:

片段一:

>>> c = 257>>> def foo():...  a = 257...  b = 257...  print a is b...  print a is c... >>> foo()TrueFalse            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高清| 兴和县| 夹江县| 通江县| 张家口市| 远安县| 东莞市| 区。| 盖州市| 龙南县| 乌审旗| 宁津县| 广德县| 延庆县| 西吉县| 子长县| 巫山县| 年辖:市辖区| 仁寿县| 鹿泉市| 昆山市| 隆昌县| 舞阳县| 芒康县| 阿荣旗| 定兴县| 太仓市| 景宁| 汾西县| 静乐县| 南宫市| 龙门县| 长丰县| 宁城县| 深圳市| 大兴区| 托里县| 江城| 泾阳县| 大名县| 镇康县|