python等值和大小比較
等值、大小比較
在python中,只要兩個物件的型別相同,且它們是內建型別(字典除外),那麼這兩個物件就能進行比較。關鍵詞:內建型別、同類型。所以,兩個物件如果型別不同,就沒法比較,比如數值型別的數值不能和字串型別的數值或字母比較。
對於python中的等值、不等值、大小比較的規則為何如此,以後學了Class的運算子過載,自然就會知道。
其實自定義的型別(python 3.x中類Class就是型別)也可以進行比較,只不過要對類的比較操作符進行運算子過載。這些以後再說,這裡先看內建型別的比較。
比較操作符有:
== != < <= > >=
例如,下面的比較全部返回True。
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物件只能參與等值和不等值比較,不能參與大小比較。
>>> 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"。
它們都是比較表示式,但卻是完全不同的比較方式:
- "=="和"!="符號比較的是資料的值是否相等、相同
- "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中儲存的地址,這裡不對此展開描述,在後面的文章會非常詳細地進行解釋。當然,放在後面並不是因為難,而是文章內容安排的先後順序,有需求可以先看看: