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

相关文章

来自专栏HappenLee的技术杂谈

C++雾中风景7:闭包

闭包(closure)是函数式编程的重要的语法结构。 闭包的概念其实很简单,一言以蔽之:闭包是带有上下文的函数。说白了,就是有状态的函数。也就是说一个局部变量...

842
来自专栏编程

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

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

1796
来自专栏数据结构与算法

1245 最小的N个和

1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description ...

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

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

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

3534
来自专栏十月梦想

php字符串基本操作

字符串查找strstr(查找目标字符串,查找关键词),stristr(查找目标字符串,查找关键词)

571
来自专栏五分钟学算法

每天一算:Reverse Linked List II

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

651
来自专栏从零开始学自动化测试

python笔记2-冒泡排序

前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序。 一、基本原理 1.概念: 冒...

3396
来自专栏青玉伏案

在Objective-C中浅谈面向对象

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

1766
来自专栏LuckQI

Redis初识~Set命令

1012
来自专栏java一日一条

Java的常见误区与细节

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

933

扫码关注云+社区