前言
在 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
新聞熱點
疑難解答