Python 中 「is」 和 「==」 的問題?
今天在梳理自己最近學到的Python知識時,突發奇想地聯想到了「is」和「==」,感覺它們的用處應該是不同的,於是在終端中做了如下測試:
&>&>&> a = ["a", "b", "c"]&>&>&> b = ["a", "b", "c"]&>&>&> a == b
True&>&>&> a is bFalse結果還在意料之中,「==」應該比較的是值,「is」應該是比較的內存地址之類的,於是我下意識地有寫了一個測試:
&>&>&> a = 21&>&>&> b = 21&>&>&> a == bTrue&>&>&> 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 |