Python中三目运算有两种实现方式,其中一种是通过and、or来实现的。通常情况下都可以正常的返回期望的值。但是在期望返回布尔类型有一个要注意的问题。
and、or的实现方式,实际上是利用逻辑运算符的短路原则实现的。短路原则简单来说就是在多个逻辑运算符组合的表达式中,用and关联的两个元素,如第一个元素为假,那么与之关联的另一个元素则不会进行计算,同理,用or关联的两个元素,如第一个元素为真,那么与之关联的另一个元素则不会进行计算。
在Python中任何对象都可以用来测试真值,以下6种情况会判定为假:
1.None。
2.False。
3.任何数值类型的0。
4.任何空序列,''、()、[]。
5.任何空映射,{}。
6.用户自定义类的实例,如果类定义了__bool__或__len__方法,当方法返回0或布尔类型False时。
所以,当使用and、or进行三目运算并期望返回布尔类型值或空序列、映射时如果不做特殊处理就会出现异常结果。
以简单的返回数值为例:
当返回的值为非0值时,可以得到期望的值,如下value为1。
value= True and 1 or 2
而如果希望在条件判定为True时返回0,若不做特殊处理则不会返回0,而是2。因为0真值为False,与True做与操作后不会短路,而是与or继续进行运算,从而返回2。如下value为2,而不是0。
value= True and 0 or 2
通过将期望的返回值放入列表或元组中, 就可以得到期望的值,如下将期望的返回值0和2分别放入列表中,三目运算会返回列表[0],然后在通过下标0将期望值取出,就可得到0。
value = (True and [0] or [2])[0]
也可以放入元组中,效果相同。
value = (True and (0,) or (2,))[0]
在三目运算表达式返回值为函数调用等返回值不确定的情况下,通过这种特殊处理,可以防止期望返回值真值测试为假时造成返回错误值的情况发生。