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

相关文章

来自专栏青玉伏案

在Objective-C中浅谈面向对象

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

1886
来自专栏java一日一条

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

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

751
来自专栏编程

Python入门基础连载(4)控制流

Python控制流语句有三种————if,for,while,有相关语言类似C,java的同学应该不会陌生的,下面我们就做下介绍: if语句 if语句用来检验一...

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

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

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

1172
来自专栏take time, save time

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

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

3369
来自专栏五分钟学算法

每天一算:Reverse Linked List II

变换的是2,3,4这三个点,那么我们可以先取出2,用front指针指向2,然后当取出3的时候,我们把3加到2的前面,把front指针前移到3,依次类推,到4后停...

1141
来自专栏闻道于事

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

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

3425
来自专栏LuckQI

Redis初识~Set命令

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

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

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

3744
来自专栏xingoo, 一个梦想做发明家的程序员

【面试虐菜】—— JAVA面试题(1)

今天参加笔试,里面有设计模式,和一些基础题! 印象最深的是:什么不是Object的函数,我蒙的finalize,哎,无知! 还问了,接口与抽象类的不同,还...

2119

扫码关注云+社区

领取腾讯云代金券