歡迎點擊「算法與編程之美」↑關注我們!
本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
歡迎加入團隊圈子!與作者面對面!直接點擊!
1.引入
在日常生活中,以經驗來看:兩個看上去相同的東西一定可以用“=”來確定關係,表示它們相等。但是在python中不能說它們完全相等的,這是爲什麼呢?
這就需要大家瞭解python對象都有的三個要素,分別是值(value)、id(身份標識)、type(數據類型),我們以感官衡量的相等其實僅僅是值與數據類型的相等,也就是通常代碼中的“==”。而每一個值都對應了一個id,要判斷兩個值的id是否相等,就得引入“is”來判斷。
2.is與==
給個簡單的例子:
圖2.1 is與==區別
可以看出,a和b兩個在表面上是相等的,也就是值是相等的,但爲什麼用is去比較的時候卻不同呢?這時便要用到id來進行判斷。
圖2.2 查看對象id
可以看出,通過id()來獲取兩個相同列表的id,發現其id是不相同的,所以在is的判斷下,這兩個對象是不相同的。總的來講,其實python的對象不僅是像所看到的只有表面一層,像人與人一樣,再怎麼相似的雙胞胎,他們的身份證(ID card)都是不同的,只是看怎麼判斷而已。
3.拓展
Python爲了優化運行空間與速度,界定了一個整數區間[-5,256],只有在這個區間裏相同的數,他們的id纔會相等,超出這個區間,id就不同,is判斷就爲false。如:
圖2.3 256與257的區別
這就是有趣的256與257的區別。
同樣有趣的範圍還有一個是20與21的區別,直接看一組實例:
圖2.4 20與21的區別
兩個明明是正確的,爲什麼會出現false呢?原因也是python的內部優化,“a”*20會被內部優化爲20個a並在一起,而大於20的話爲了優化內存,是不會對“a”*21進行優化的,所以is不成立。
4.總結
Python中的優化和對象其實是很“神祕”的,所以下次在編寫代碼時,發現怎麼也理解不了is兩頭的東西怎麼不相等時,想想三要素,想想優化規則,或許就能恍然大悟了。
END
編 輯 | 王楠嵐
責 編 | 李和龍
where2go 團隊
微信號:算法與編程之美
長按識別二維碼關注我們!
溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!