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

python 中 if return空 python if none_赋值

可以看到,这里什么都没输出
bool输出测试一下:

python 中 if return空 python if none_自定义类_02

跟我们想要的一样,是False

 

测试空列表

python 中 if return空 python if none_python 中 if return空_03

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

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

测试如下:

python 中 if return空 python if none_自定义类_04


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

python 中 if return空 python if none_赋值_05

 

测试常数值

python 中 if return空 python if none_赋值_06

转为bool看看效果:

python 中 if return空 python if none_python_07

 

测试自定义类

python 中 if return空 python if none_自定义类_08

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

python 中 if return空 python if none_python 中 if return空_09

流程进入了__bool__ 函数

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

python 中 if return空 python if none_赋值_10

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

python 中 if return空 python if none_python_11