python等值和大小比较

等值、大小比较

在python中,只要两个对象的类型相同,且它们是内置类型(字典除外),那么这两个对象就能进行比较。关键词:内置类型、同类型。因此,两个对象若是类型不一样,就无法比较,好比数值类型的数值不能和字符串类型的数值或字母比较。html

对于python中的等值、不等值、大小比较的规则为什么如此,之后学了Class的运算符重载,天然就会知道。python

其实自定义的类型(python 3.x中类Class就是类型)也能够进行比较,只不过要对类的比较操做符进行运算符重载。这些之后再说,这里先看内置类型的比较。测试

比较操做符有:code

==  !=  <  <=  >  >=

例如,下面的比较所有返回True。htm

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"。

它们都是比较表达式,但倒是彻底不一样的比较方式:

  • "=="和"!="符号比较的是数据的值是否相等、相同
  • "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中保存的地址,这里不对此展开描述,在后面的文章会很是详细地进行解释。固然,放在后面并非由于难,而是文章内容安排的前后顺序,有需求能够先看看:

相关文章
相关标签/搜索