對python中等值和大小比較

等值、大小比較python

在python中,只要兩個對象的類型相同,且它們是內置類型(字典除外),那麼這兩個對象就能進行比較。關鍵詞:內置類型、同類型。因此,兩個對象若是類型不一樣,就無法比較,好比數值類型的數值不能和字符串類型的數值或字母比較。
對於python中的等值、不等值、大小比較的規則爲什麼如此,之後學了Class的運算符重載,天然就會知道。
其實自定義的類型(python 3.x中類Class就是類型)也能夠進行比較,只不過要對類的比較操做符進行運算符重載。這些之後再說,這裏先看內置類型的比較。
比較操做符有:測試

==  !=  <  <=  >  >=

例如,下面的比較所有返回True。code

bool(1 < 2)
bool('a' < 'c')
bool('A' < 'a')    # 字符大小:A < Z < a < z

bool([1,2,2] < [1,2,3])
bool((1,2,2) < (1,2,3))
bool({1,2,2} < {1,2,3})

python中同類型的內置類型對象(字典除外),都是從左開始,一個一個元素向後比較,就算中間遇到嵌套的容器結構(如list/tuple/Set),也會遞歸到嵌套的結構中去一個個比較。對象

>>> bool([1,2,[3,3]] < [1,2,[3,4]])
True

注意,None對象只能參與等值和不等值比較,不能參與大小比較。blog

>>> None == None
True
>>> None != None
False
>>> None <= None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<=' not supported between instances of 'NoneType' and 'NoneType'

python支持連續比較,連續比較時等價於使用and運算。例如:遞歸

a < b < c    等價於  a < b and b < c
a < b > c    等價於  a < b and b > c
a == b < c   等價於  a == b and b < c

必定要注意連續比較時的邏輯。例如1 == 2 < 3 返回False,但它等價於 1 == 2 and 2 < 3,而不是先評估1==2獲得False,再將比較的結果與後面的作比較,即等價於False < 3,這意味着0<3,這其實是返回True的。圖片

>>> 1 == 2 < 3
False

>>> (1==2) < 3
True

連續比較是一種比較語法,它不只限於數值的連續比較,還支持其它類型。好比:內存

>>> "ac" > "ab" < "ad"
True

is 和 ==字符串

有兩種比較數據對象是否相等的方式:"=="和"is",它們的否認形式分別爲"!="和"is not"。
它們都是比較表達式,但倒是徹底不一樣的比較方式:ast

  • " =="和"!="符號比較的是數據的值是否相等、相同
  • "is"比較的是兩個數據對象在內存中是不是同一個數據對象。換句話說,比較的是內存地址
    等號比較很容易理解,只要值相等就爲True,不然爲False。

is比較的是內存中的數據對象。例如:

>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b
False

a和b在數值上是相等的,因此a == b返回True。但它們分別指向的內存中的數據對象1000,卻不是同一個數據對象,因此a is b返回False。以下圖,內存中有兩個1000。
在這裏插入圖片描述
若是是下面這種狀況:

>>> a = 1000
>>> b = a
>>> a is b
True

結果中a is b返回True,由於b = a是將a中保存的1000的地址賦值給b,使得b中也保存1000地地址。以下圖,內存中只有一個1000,可是a和b都指向這個1000。
在這裏插入圖片描述 is測試還有些特殊狀況,另外,關於b = a爲何賦值的是a中保存的地址,這裏不對此展開描述

相關文章
相關標籤/搜索