Python手記 is 和 的區別

2021-10-18 20:22:55 字數 2237 閱讀 9823

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,...