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]

 在三目运算表达式返回值为函数调用等返回值不确定的情况下,通过这种特殊处理,可以防止期望返回值真值测试为假时造成返回错误值的情况发生。