if x 和 if x is not None的区别(python)

if xif x is not None

if not xif 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,所以,如果xNone,那么if x返回的也是False,读到这里,你会这样觉得,“没什么不对啊,这样正好符合我的目的啊,我就是用来判断x是否为空值啊!如果x不是空,则返回True,是空则返回False” 。如果你有这样想,那你就很有必要继续往下读了。

-----------------解释如下---------------------------

python里面的其他值也被检测为False。最常见的例子就是空列表bool([])也返回False。但是,空列表有一个隐含的意思,它不等于None!!None意味着没有值,而空列表意味着零个值,这在语义上是不同的!有些人弄混淆就是这里没弄清楚。

---------------------------------------------

让我们来测试一下 x=None的情况

![x=None](https://img-blog.csdnimg.cn/20190404201132966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9rZXZpbi1qdW5qaWUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70
可以看到,这里什么都没输出
此时的bool(x)是什么呢?
在这里插入图片描述
跟我们想要的一样,是False

接下来测试一下空列表

在这里插入图片描述
可以看到这里只输出了下面的一条语句,这里就像我们上面说的,空列表不等于None
哎?那为什么上面那条语句不输出呢?
我们上面说到,python会自动给非boolean类型进行bool判断的时候转换成boolean类型。
我们来看看是不是这样~
在这里插入图片描述
这就解释了上面那条语句为什么没输出了吧
如果我们的列表是有值的,比如x=[1],我们来看看bool(x)的结果吧。
在这里插入图片描述
怎么样?这下清楚多了吧。

接下来看看常数值

在这里插入图片描述
这个就清楚多了,没列表那么绕
在这里插入图片描述

接下来再看最后一个,自定义类

看了简单的常数值,来看看一个比较不容易的。类。
在这里插入图片描述
可以看到,x是被__bool__初始化的。
它的bool值是什么呢?
在这里插入图片描述
看!那句话被打印了,说明它跑去里面执行了东西!

还是很糊涂?我们来改一下def __bool__(self):的返回值,尝试一下返回False。
在这里插入图片描述
看,因为返回了False,所以上面那句话就不打印了,下面那句依旧打印。
在这里插入图片描述
好了,看到这里,希望你们已经懂了,很高兴能帮助到大家,如果有什么不明白的,可以在评论区留言,我们一起来讨论。

  • 22
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值