python中的「is」和「==」用於對兩個變數進行比較。
不同的是,「==」用於比較兩個變數的值,而「is」用於比較兩個變數的標識。
什麼是變數?這是個不太好回答的問題。
在很多語言裡,我們習慣性把變數理解成「儲存資料的箱子(容器)」,然而這種理解方式不適用於引用式變數。因為兩個變數可以指向同乙個物件,但我們不能理解成兩個箱子中分別存放著同乙個資料,這是相當荒謬的。
在《流暢的python》【巴西】luciano ramalho這本書中給了乙個更加契合的解釋:變數是附加在物件上的標註。
與把變數當成資料的容器不同,作者傾向於把引用式變數當做「便利貼」,乙個物體上貼上多個「標籤」,這是合理的。
有了上面的理解,我們來看乙個例子:
>>
> a =[1
,2,3
]>>
> b = a
>>
> a is b
a和b是不同的兩個變數名,但a和b標記的是同乙個資料(list物件)。
python中的每個物件都有乙個唯一的標識,從被建立到被**,伴隨這個物件的「一生」。就像是人類的身份證一樣,這個標識在變數的生命週期內是不會改變的。
而「is」就是比較兩個變數所指物件的標識(id)。這個標識,可以借助內建函式id()來獲取。
換而言之,如果兩個變數id相同,那麼它們指向的是同乙個物件。
關於id()函式,在不同的實現中返回的內容不同,例如cpython返回物件記憶體位址的整數表示,而其他實現jython、ironpython等未必相同。但有一點可以確定,每個物件的id標識唯一。新建乙個與a相同的列表:
>>
> a =[1
,2,3
]>>
> b = a
>>
> a is b
true
>>
>
id(a)
2478905612416
>>
>
id(b)
2478905612416
>>
> c =[1
,2,3
]>>
> a is c
猜一猜「a is c」的返回結果是什麼?沒錯,false。
雖然c所指的列表與a相等,但這兩個物件卻不相同。你是你,我是我,長得像而已,再沒有其他關係。
「==」運算子,就是計算兩個變數所指物件的值(內容)是否相同。
因為a和b指的是同乙個物件,a == b的返回結果當然也是true。畢竟和我長得最像的,一定是我自己嘛。
「==」運算是語法糖,可以理解為一種呼叫函式的簡單書寫方式。
當執行表示式「a == c」的時候,其實python執行的是「【圖放下面,markdown編輯器的文字樣式打不出來】」這麼一條語句。(eq是equal的縮寫)
捎帶問一句,如何打出編輯器本身用於樣式的標記符號?在python中,大部分內建型別__eq__函式的實現都是比較兩個變數所指物件的值,所以「==」的作用便成了判斷值是否相等。
使用者自定義的類,預設繼承自object。但object的__eq__方法卻是用於比較兩個物件的id。所以,如果你想讓自定義類的例項可以正確使用「==」,需要自己編寫__eq__函式進行覆蓋。
「self.value == arg.value」會去呼叫內建型別interger的__eq__函式。1、is用來判斷兩變數所指物件的id是否相同,即是否為同乙個物件。
2、==用來判斷兩變數所指物件的內容是否相同,即值是否相等。
3、==背後是在呼叫物件的__eq__方法,通過重寫此方法,可以修改判斷結果。
python學習手記
1.list由小到大排序用list.sort 由大到小排序用list.sort reverse true 2.list逆序用list.reverse 3.list 0 代表list中的第乙個元素,中括號一般用於表示元素位置,表示元素 4.dict中沒有排序的說法,keys用於表示位置,應用時用 6....
「is」和「 」的區別 Python
is用來檢查物件的標識 id id 函式用於獲取物件記憶體位址,而 用來檢查兩個物件引用的變數的值是否相等。通過乙個例子說明。建立一些列表並將其分配給不同的名字。請注意,下面的b指向與a相同的物件 a 1 2,3 b a c 1,2,3 下面來檢查是否相等,你會注意到結果顯示它們都是相等的。prin...
python 和is的區別
python中物件包含的三個基本要素,分別是 id 身份標識 type 資料型別 和value 值 是python標準操作符中的比較操作符,用來比較判斷兩個物件的value 值 是否相等 is也被叫做同一性運算子,這個運算子比較判斷的是物件間的唯一身份標識,也就是id是否相同 舉例 x y 4,5,...