if x 和 if x is not None的区别(python)
if x
和 if x is not None
if not x
和 if x is None
以上两行的式子都不是等价的!!!
当把None
赋予一个变量x
时,x也许被赋值了,也许未被赋值! 接下来测试x
是否被赋值成功。
当使用 if x is None
的时候,操作符是is
,用来检查x
的id。None
在python里是单例,当使用if x
的时候,不同类型是有一些不同的。
如果期望值是一个boolean类型,而此时假设x
不是一个boolean类型,则此时python会自动地调用__nonzero__
方法。例如,if x
事实上是这样被执行的,if x.__nonzero__
或者(bool(x)
)。 __nonzero__
是一个被命名得很反人类的名字,在python3中叫做__bool__
它用来检测一个类的boolean值。
最奇葩最奇葩最让人困惑的地方来了!注意!bool(None)
返回的是False
,所以,如果x
是None
,那么if x
返回的也是False
,读到这里,你会这样觉得,“没什么不对啊,这样正好符合我的目的啊,我就是用来判断x是否为空值啊!如果x不是空,则返回True,是空则返回False” 。如果你有这样想,那你就很有必要继续往下读了。
-----------------解释如下---------------------------
python里面的其他值也被检测为False
。最常见的例子就是空列表,bool([])
也返回False
。但是,空列表有一个隐含的意思,它不等于None
!!None
意味着没有值,而空列表意味着零个值,这在语义上是不同的!有些人弄混淆就是这里没弄清楚。
---------------------------------------------
让我们来测试一下 x=None
的情况
可以看到,这里什么都没输出
此时的bool(x)是什么呢?
跟我们想要的一样,是False
接下来测试一下空列表
可以看到这里只输出了下面的一条语句,这里就像我们上面说的,空列表不等于None
。
哎?那为什么上面那条语句不输出呢?
我们上面说到,python会自动给非boolean类型进行bool判断的时候转换成boolean类型。
我们来看看是不是这样~
这就解释了上面那条语句为什么没输出了吧
如果我们的列表是有值的,比如x=[1]
,我们来看看bool(x)
的结果吧。
怎么样?这下清楚多了吧。
接下来看看常数值
这个就清楚多了,没列表那么绕
接下来再看最后一个,自定义类
看了简单的常数值,来看看一个比较不容易的。类。
可以看到,x是被__bool__
初始化的。
它的bool值是什么呢?
看!那句话被打印了,说明它跑去里面执行了东西!
还是很糊涂?我们来改一下def __bool__(self):
的返回值,尝试一下返回False。
看,因为返回了False
,所以上面那句话就不打印了,下面那句依旧打印。
好了,看到这里,希望你们已经懂了,很高兴能帮助到大家,如果有什么不明白的,可以在评论区留言,我们一起来讨论。
if x 和 if x is not None的区别(python)相关推荐
- golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用
RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...
- locust入门:单机使用locust运行压力测试
locust的官方文档在这里: http://docs.locust.io/en/stable/ 前置:locust的测试脚本使用为python(若未安装python环境,可以搜索安装python) ...
- 使用Maven打包生成的-SNAPSHOT.jar与-RELEASE.jar分别代表什么?SNAPSHOT是什么意思?RELEASE是什么意思?
使用Maven打包后生成 XXXXXXX-1.0.0-SNAPSHOT.jar 和 XXXXXXX-1.0.0-RELEASE.jar 的区别???? 首先,根本原因:这是因为你的pom.xml中的项 ...
- docker镜像的备份和恢复
在使用docker的时候总会出现这种情况:下载东西很慢很慢,下载完配置完以后,突然,一个地方配置出现了问题,无法恢复,需要重新装载,那么,之前的所有配置.安装.下载都没了,又是一个大活~ 该怎么办呢? ...
- UUID的使用及其原理
今天敲项目要用UUID,想起之前老师告诉UUID的使用,但没说具体的生成逻辑,于是我进行了百度 首先,UUID的使用: //生成随机的UUID String uuid = UUID.randomUUI ...
- CentOS Docker安装配置部署Golang web helloworld
目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...
- 基于Golang的CLI 命令行程序开发
基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...
- 中级实训第一天的自学报告
目录[阅读时间:约10分钟] 中级实训第一天的自学报告 姓名:隐藏敏感信息 学号:隐藏敏感信息 一.Vi/Vim 二.Java 三.Ant 四.Junit [附加]五.SonarQube [附加]六. ...
- Go语言的错误异常处理机制及其应用
一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...
- 【Datawhale-Python】Task1
1.环境搭建 略(见之前博客) 2.python初体验 ①print() 略 ②input() Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型. > ...
最新文章
- 机器人教练SWOT分析_学车没人教,包头这个驾校机器人教练已上岗,再也不怕被教练骂了...
- c# mysql app.config_60. C# -- 读取 appconfig文件配置数据库连接的方法
- c bitset get_Java BitSet get()方法与示例
- Unity 协程深入解析与原理
- Route Class
- 输入一批整数,输出最大最小值,输入0结束
- Python图像处理库:Pillow 初级教程
- 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
- 南极沉船_世界上一些神秘的沉船,都成了仿佛被世界遗弃的盛景
- 数字水印技术的基本概念和现状
- [网站设计] 素材网罗
- resnet152训练_ResNet改进版来了!可训练网络超过3000层!相同深度精度更高
- 5990.8亿,一个如约而来的重大项目
- CSS:transform应用之立体魔方案例
- 七里香计算机音乐谱子,七里香(改编自《新经典》)
- 2个大厂 100亿级 超大流量 红包 架构方案
- 基于任务点的加速仿真
- vin端口是什么意思_「每日一题」什么是 Web 服务器(server)
- 开启codelite的c++11
- Movicon/Connext设备连接实例(一)——Movicon.NExT与Codesys通讯
热门文章
- mysql 更改建表语句_MySql:如何通过Sql语句创建表,更改表?,这几步你要了解...
- 记录用bazel编译tensorflow源码
- 机器视觉系统图像采集卡功能解析
- Memcached查找命令
- 傻子都能看懂的 —— 详解欧拉公式推导
- VUE2.0 饿了么学习笔记(10)加减号组件cartcontrol
- Beyond One-Model-Fits-All: A Survey of Domain Specialization for Large Language Models
- Bitmap image and image mask
- CBA向B站索赔4亿元,究竟为何?
- 公司流行加班,而且把加班的时间长短还月度排名,我昏!