今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘.
Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接看代码
print True and 1 # 1 print True or 1 # True print False and 1 # False print False or 1 # 1
可以看到, 虽然1会被当做布尔值计算, 但整个表达式的计算结果却不一定是布尔值, 而是根据表达式的不同而不同. 上面几个表达式不同的结果, 就是短路逻辑. 用大白话讲, 就是一旦Python能判断整个表达式是True还是False, 就不会进行后续的计算了, 就是逻辑被短路了, 后续的表达式被忽略了.
比如True or 1
的结果为True
就是因为不管or
后面是任何值, 整个式子的结果都必定是True, 所以Python看到True
, 看到or
, 后面的1就不看了, 1被短路了, 返回了True
; 同样的False and 1
也是一样, 看到False
然后是and
不管后面是什么, 整个式子的结果必定是False
, 所以1被短路了, 返回False
.
相应的, 为什么False or 1
会返回1, 就是因为False
和or
判断不了式子的结果, 整个式子是True还是False, 是由or
后面的值来决定的, 所以Python要把整个式子看完, 所以返回1.
明白了什么是短路逻辑之后, 我们看一看三目运算符
三目运算符, 又叫三元运算符. 熟悉Java的同学可能会知道, 它的形式是这样的b?x:y
, 对于这个表达式来说, 如果条件b
为True
, 那表达式的结果就是x
, 如果b
为False
, 那表达式的结果就是y
. 这是一种很方便的写法, 比if语句简洁很多.
但Python中早期没有类似写法的三目运算符, 所以就出现了一种利用短路逻辑, 用and
和or
来模拟三目运算符的写法, 下面我们看代码
A = X and 'table' or False
这句代码就是在利用短路逻辑模拟三目运算符, 当X
为True
的时候, A
会被赋值为'table'
, 当X
为Flase
的时候, A
会被赋值为False
;
乍一看好像很不错, 但这种写法却有个坑, 我们看这句代码
True and 0 or 1
如果我们把刚才的写法当三目运算符来使用, 那么条件语句是True
, 表达式应该返回0
才是我们期望的结果, 但实际上这个表达式会返回1
; 因为True and 0
的值为True
, 整个表达式的值是由or
之后的值来决定的, 所以Python会对后面的值做判断, 导致返回了1
, 这就是为什么and...or
这个写法有坑的原因
如果想在Python中使用三目运算符, 可以使用if...<a href="http://www.php.cn/wiki/111.html" target="_blank">else</a>
写法, 具体看代码
# <为真时的结果> if <判定条件> else <为假时的结果>0 if True else 1
用if...else
的写法, 结果就会跟我们期望的相同, 当条件为True
时, 返回前面的值, 条件为False
时, 返回后面的值. 不会有坑, 只是写的时候要注意, 条件和返回值的顺序跟Java中的三目运算符不同, 不要搞错即可
Atas ialah kandungan terperinci 使用Python三目计算符的用法及短路逻辑方法介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!