为什么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 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

15. 程序编程进阶:函数的返回值

函数中代码块执行的结果,如果我们后面的代码中需要用到,就需要函数返回我们执行的结果,就是需要返回值;

1092
来自专栏我和PYTHON有个约会

32.企业级开发进阶4:正则表达式

本节内容,要讲解的和我们的信息检索有关系,这一方面也是Python在目前非常流行的一个应用方向:爬虫。

921
来自专栏java一日一条

那些经常被遗忘的 Java 面试题

静态内部类实际上与普通类(即类名必须与文件名一样的顶级类)一样,只是静态内部类在某一类的内部定义了而已,既然是类,要想使用就必须实例化。概念上与静态变量、静态方...

651
来自专栏take time, save time

初级程序员面试不靠谱指南(三)

二、指针的好基友的& 1.&的意义。说&是指针的好基友其实不恰当,因为&这个符号在C/C++不止有一种含义,但是因为其经常会和指针一起出现在被问的问题列表上,所...

3299
来自专栏java一日一条

Java的常见误区与细节

1 在Java中,没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。同时,为了避免程序员自行使用...

1053
来自专栏PPV课数据科学社区

走近 Python (类比 JS)

Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 ...

40110
来自专栏转载gongluck的CSDN博客

python笔记:#008#变量的命名

变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名、函数名 名字 需要有 见名知义 的...

3604
来自专栏闻道于事

Java之面向对象概述,类,构造方法,static,主方法,对象

一、面向对象概述 面向过程 “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于...

3265
来自专栏LuckQI

Redis初识~Set命令

1112
来自专栏青玉伏案

在Objective-C中浅谈面向对象

  接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习O...

1806

扫码关注云+社区