为什么Python中的None is None is None == True

最近在StackOverflow上看到了一个问题,为什么Python中的None is None is None返回True,看到大家的讨论后对Python中的比较运算有了更深的认识。

None is None is None 不同于 (None is None) is None

题主和很多人一开始都认为None is None is None就等同于(None is None) is None,而后者百分之百是False,因为True is None == False.然而问题的关键是is在Python中是比较运算符,而不是算数运算符。

括号在比较运算中并不是改变运算优先级,而是直接返回括号内比较运算的结果,这个结果只会是True或者False,而TrueFalse已经不是原来比较的对象了。

就像(1 < 2) < 3在Python中虽然是True但事实上比较的是True < 3, 而True在比较运算中是当作1看待的。换成了(3 > 2) > 1结果就是False了,因为True是等于1的。

那么Python是如何处理None is None is None的呢?

Python中连续进行比较运算的底层实现

上一节提到了(3 > 2) > 1在Python中是False,但是懂一点Python的人都知道3 > 2 > 1在Python中是合法的并且返回True,我们可以看一下这一个表达式在Python字节码中是如何进行处理的。

我们可以看到3 > 2 > 1事实上就相当于3 > 2 and 2 > 1。Python中对于

a compare_operation1 b compare_operation c

的处理就是

a compare_operation1 b and b compare_operation c

所以对于比较运算符的isNone is None is None就是None is None and None is None,结果是True也就没什么问题了。

对于Python的这一条特性大家平时一般都用在连续的方向一致的大小比较中,例如:

a < b < c
a <= b < c
a > b >= c > d

事实上我们完全可以混用各种比较运算符,例如:

值得注意的是is not被视为一个比较运算符,所以途中的第三个表达式相当于True is not Flase and False is False

结语

Python中是有一些自己独有的语法特性,底层的机理却不是多么的“黑魔法”。希望这篇文章可以给大家一些帮助和启发。

最后祝大家享受生活,享受代码。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP技术

字符串和编码

字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才...

2687
来自专栏Python爱好者

Java基础笔记05

1408
来自专栏有趣的Python

py编程技巧-1.4-如何根据字典中值的大小对于字典中的项排序

实际案例: 某班英语成绩以字典形式存储为{'mtianyan',100,'tudou':'100','shabi':59} 根据成绩高低计算学生排名 解决...

3136
来自专栏醉梦轩

Python和JavaScript中的生成器与协程

Python和JavaScript中都有生成器(Generator)和协程(coroutine)的概念。本文通过分析两者在这两种语言上的使用案例,来对比它们的差...

1962
来自专栏图形学与OpenGL

实验2 C++数组与指针

694
来自专栏北京马哥教育

看完这篇,你就知道Python生成器是什么

生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得不得去理解它、使用...

35312
来自专栏用户2442861的专栏

python编码问题

我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。

531
来自专栏CaiRui

Python列表删除的三种方法

1、使用del语句删除元素 >>> i1 = ["a",'b','c','d'] >>> del i1[0] >>> print(i1) ['b', 'c',...

1788
来自专栏企鹅号快讯

编码,深浅copy

encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关...

3166
来自专栏HTML5学堂

2016.01.05 HTML5真题练习

HTML5学堂:每天一道题,强壮程序员!今日主要涉及01.04日关于Date对象的题目解答,以及一道涉及数组转换成字符串操作的题目。 HTML5真题【2016....

2655

扫码关注云+社区