等值、大小比較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比較的是內存中的數據對象。例如:
>>> 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中保存的地址,這裏不對此展開描述