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,所以上面那句话就不打印了,下面那句依旧打印。