数学中的“比较”是很单纯的,就是衡量两个数字哪个大、哪个小。但是 Python 语言中,除了兼顾数学上的“比较”之外,还把事情搞得复杂了一些,且看本节揭示其复杂性。
3.2节学了算术运算符,除此之外,数学中还有“比较运算符”,在 Python 中如何实现?也很直接,请读者观察键盘(如图3-6-1所示),其中有输入比较符号的的键,按下“ Shift ”键,然后按下标有“ < ”或“ > ”的键,即可输入小于号或大于号——要在英文状态。
图3-6-1 比较符号键
比如,在 Python 交互模式中输入:
>>> 3.14 < 2.72 # (1)
False
>>> 3.14 > 2.72 # (2)
True
注释(1)和(2)是比较表达式,即两个数字对象进行比较的不等式。如果不等式成立,就返回True
,否则返回 False
。
除了注释(1)(2)表达式中的小于号和大于号之外,其他比较运算符列在表3-6-1中,请读者参考。
表3-6-1 比较运算符
运算符 | 描述 | 实例 (设 a=10,b=20) |
---|---|---|
== | 等于,比较对象是否相等 | (a == b) 返回 False |
!= | 不等于,比较两个对象是否不相等 | (a != b) 返回 True |
> | 大于,返回 a 是否大于 b | (a > b) 返回 False |
< | 小于,返回 a 是否小于 b | (a < b) 返回 True |
>= | 大于等于,返回 a 是否大于等于 b | (a >= b) 返回 False |
<= | 小于等于,返回 a 是否小于等于 b | (a <= b) 返回 True |
is | 判断对象的同一性 | (a is b) 返回 False |
Is not | 对象同一性判断的否定 | (a is not b) 返回 True |
表3-6-1中所列的各项比较运算符,不仅能够用于比较数字,还能应用于后续的其他对象类型的比较——这就是 Python 中“比较”的一种复杂性体现。
表3-6-1中显示的“ == ”符号,是用来比较两个对象是否相等,请注意区别于数学中习惯的“ = ”符号。在 Python 中(乃至于所有高级语言中),“ = ”用于赋值语句(参阅第6章6.1.1节),表示一个变量和一个对象之间建立引用关系。
>>> a = 9 # 赋值语句,变量和对象建立引用关系
>>> b = 9.0
>>> a == b
True
a == b
即比较变量 a
引用的对象与变量 b
引用的对象是否相等。
在3.1.2节业已学习到了 ==
的含义,并且同时提到了“相等”并不意味着是“同一个对象”,如上述示例中的整数 9
和浮点数 9.0
。下面要着重要说明的“相等”和“同一”的区别。
如3.1.2节所述,在 Python 中两个对象是否“同一”,可以看它们的内存地址是否相同,比如:
>>> a = 256
>>> b = 256
>>> id(a) == id(b) # (3)
True
内置函数 id()
返回了参数对象的内存地址,注释(3)的表达式返回了 Ture
,说明 a
和 b
引用的对象内存地址相同——这就是重复3.1.2节的内容,读者不要急躁,看下面的:
>>> c = 257
>>> d = 257
>>> id(c) == id(d)
False
>>> id(c)
140374295342960
>>> id(d)
140374295340752
是不是很神奇?同样是整数,这时候两个变量分别引用了两个不同的对象。
如果查看浮点数——所有浮点数都如此。例如:
>>> f = 3.14
>>> g = 3.14
>>> id(f)
140374295339504
>>> id(g)
140374295339312
变量 f
引用了浮点数对象 3.14
,Python 在内存中创建了该对象;变量 g
再引用一个浮点数对象,只不过此对象的值还是 3.14
,Python 在内存中又创建了一个新对象,而没有将变量 g
指向前面那个 3.14
对象。前面看到的变量 c
和 d
也如此,分别引用两个不同的 257
对象。但是变量 a
和 b
则不然,虽然操作与后面的二者类似,但它们引用了同一个 256
对象。
这是因为 Python 中做了一个规定,将常用的值(整数 -5
到 256
)默认保存在内存中,从而节省内存开支。如果变量引用这些值,就直接指向内存中已有的,不再新建。所以,才出现上面的操作结果。
判断两个对象是否相等,使用 ==
符号。虽然注释(3)的表达式也能判断两个对象是否“同一”,但显得不那么“近乎自然”——编程语言的发展方向就是越来越趋近自然语言。于是,Python 提供了一个用于判断对象是否“同一”的关键词 is
。
>>> c is d
False
>>> a is b
True
is
用于判断两侧的对象是否是同一个,返回 False
,说明不是同一个对象,否则返回 True
。因此 is
也被称为身份运算符。
★自学建议 “内存”,全称“内部存储器”。计算机的存储系统可以分为两大类:内部存储器和外部存储器。其中内部存储器接受 CPU 的控制与管理,只能暂存数据信息。 此外,“内存”这个词在某些语境下,还是“主板上的RAM”的代称。 请读者查阅有关资料,了解存储器知识。”
“相等”和“同一”的上述探讨,不仅仅存在于数字对象,后续要学习的其他类型的对象,也有同样问题,请读者届时要特别注意辨识 is
、==
的作用效果。