標籤:

Python 中 「is」 和 「==」 的問題?

今天在梳理自己最近學到的Python知識時,突發奇想地聯想到了「is」和「==」,感覺它們的用處應該是不同的,於是在終端中做了如下測試:

&>&>&> a = ["a", "b", "c"]

&>&>&> b = ["a", "b", "c"]

&>&>&> a == b

True

&>&>&> a is b

False

結果還在意料之中,「==」應該比較的是值,「is」應該是比較的內存地址之類的,於是我下意識地有寫了一個測試:

&>&>&> a = 21

&>&>&> b = 21

&>&>&> a == b

True

&>&>&> a is b

True

???怎麼「is」就便True了,然後我挨著測試了很多用例,發現整型從-5到256使用「is」比較都是True,超出這個範圍就是False,這裡面有什麼是我知識空白區嗎?求解,感謝!互動式環境是Python3.5.2版本


==是python標準操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等,例如下面兩個字元串間的比較:

&>&>&> a = "ilovepython"
&>&>&> b = "ilovepython"
&>&>&> a == b
True

is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同。通過對下面幾個列表間的比較,你就會明白is同一性運算符的工作原理:

&>&>&> x = y = [4,5,6]
&>&>&> z = [4,5,6]
&>&>&> x == y
True
&>&>&> x == z
True
&>&>&> x is y
True
&>&>&> x is z
False
&>&>&>
&>&>&> print id(x)
3075326572
&>&>&> print id(y)
3075326572
&>&>&> print id(z)
3075328140

前三個例子都是True,這什麼最後一個是False呢?x、y和z的值是相同的,所以前兩個是True沒有問題。至於最後一個為什麼是False,看看三個對象的id分別是什麼就會明白了。


其實可以看一看python的內置函數(就是雙下劃線__)開頭的那些,會對具體的實現和細節有比較好的了解。

對於第三個問題,是因為python為了提高性能,所以直接創建了-5到256的整數值的對象,因為這些數值會經常出現。這樣就不用每次出現一次創建一次對象了,可以提高性能並減少內存消耗。


好問題,這跟python中垃圾回收機制有關。
在python中的GC垃圾回收機制中,當定義兩個相同的字元串引用計數為0,觸發垃圾回收。其中python為了優化速度,使用了小整數池對象池,避免為整數頻繁申請和銷毀內存空間。
即:整數定義在[-5,257)這些對象是python提前建立好的,不會被垃圾回收,在python中,所有位於這個範圍內的整數使用的都是同一個對象,即指向同一個內存空間。而不在這個小整數池裡面的整數,每一個大整數,均創建一個新的對象,這些也被成為大整數池!

總結:小整數[-5,257)和單個字元為共用對象,是常駐內存。
樓主也可以試一下,如果兩個變數字元串含空格a="hello world" b="hello world" a is b 返回False
如果c="helloworld" d="helloworld" c is d返回True

手機碼字,排班毋介意!


http://www.codesec.net/view/520158.html

別遇到啥問題就上知乎問,先自己搜索一下


Learning python上有提過這個問題 解釋為緩存

你還可以用sys.getrefcount()獲取一個對象的當前引用計數

你會看到1這種對象被引用了很多次

因為這個1不僅僅你在使用

當然你還會發現其他你創建的任何對象用這個函數得到的值是2

因為作為參數傳入的getrefcount的時候也要被引用一次

因為是手機 所以這個1沒有在電腦上被引用得多


推薦閱讀:

wxPython什麼時候可以支持Python3.5?
python中字元串 s[ : -1]是什麼意思?
為什麼用pycharm在同目錄下import,pycharm會報錯,但是實際可以運行?
不同的語言中多進程和多線程具體的原理是什麼?

TAG:Python |