python3 if x 和 if x is not None 区别

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输出测试一下:

跟我们想要的一样,是False

 

测试空列表

可以看到这里只输出了下面的一条语句

python会自动给非boolean类型进行bool判断的时候转换成boolean类型。

测试如下:


如果列表是有值的,比如x=[1],测试如下:

 

测试常数值

转为bool看看效果:

 

测试自定义类

可以看到,x是被__bool__初始化的。
测试下bool返回

流程进入了__bool__ 函数

再次测试 改一下def __bool__(self):的返回值,尝试一下返回False。

看,因为返回了False,所以上面那句话就不打印了,下面那句依旧打印。

 

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值