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中保存的地址,这里不对此展开描述,在后面的文章会非常详细地进行解释。当然,放在后面并不是因为难,而是文章内容安排的先后顺序,有需求可以先看看:
最新文章
- 如何优雅的使用RabbitMQ
- webpack react基础配置一
- Gradle简介和安装
- GIT 查看/修改用户名和邮箱地址
- ORACLE 查看RMAN的备份信息总结
- grunt 使用
- STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)
- 虚拟机Linux----Ubuntu1204----退格键方向键无法使用
- vb.net-三种将datagridview数据导出为excel文件的函数
- HDU 3357
- js下的sleep实现
- Win7桌面快捷方式全变成某个软件的图标,然后所有快捷方式都只打开这个图标的软件
- HDU 畅通工程系列
- IC卡、M1卡、CPU卡、SAM卡、PSAM卡的联系与区别
- jsp标签简介
- Python 静态方法,类方法,属性方法
- Robbers&#39; watch CodeForces - 685A (暴力)
- Specular Aliasing与Specular Leaking
- flume系统使用以及与storm的初步整合
- Java_IO流输入输出
热门文章
- django 如何接收bootstrap-table传送的 ajax数组
- WEB服务器搭建(Apache+Tomcat+eclipse)
- 收集几个html和element-ui的录入控件
- JDBC数据库
- nmap 介绍
- roadhog如何支持除development和production外的其他环境变量配置
- noip第25课资料
- 基于react可无限向内部添加节点的tree
- 《Node.js高级编程》之Node 核心API基础
- .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能