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
,所以上面那句话就不打印了,下面那句依旧打印。
好了,看到这里,希望你们已经懂了,很高兴能帮助到大家,如果有什么不明白的,可以在评论区留言,我们一起来讨论。