Python|python對象三要素與is

歡迎點擊「算法與編程之美」↑關注我們!

本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。

歡迎加入團隊圈子!與作者面對面!直接點擊!

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 團隊


   

微信號:算法與編程之美          

長按識別二維碼關注我們!

溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章