逻辑and运算符对整数的作用机制探究及实验疑问
理解Python中
and与or的短路求值行为 我来帮你理清你做的这些Python实验背后的逻辑,你一开始联想到布尔值的数值运算其实和这个现象没关系,核心是Python的短路求值特性。
先看你做的实验代码:
In [95]: 1 and 2 Out[95]: 2 In [96]: 1 and 5 Out[96]: 5 In [97]: 234324 and 2 Out[97]: 2 In [98]: 234324 and 22343243242 Out[98]: 22343243242L In [99]: 1 or 2 and 9 Out[99]: 1 # 你对比的布尔值运算 In [101]: True + True Out[101]: 2 In [102]: True * 5 Out[102]: 5
为什么会有这样的结果?
Python里的and和or不是简单返回布尔值,而是遵循短路求值规则,返回的是表达式的实际值:
and的规则:先判断左侧表达式是否为真值(非0数字、非空对象、True等都属于真值)。如果左侧是真值,就返回右侧表达式的结果;如果左侧是假值(0、空对象、False),直接返回左侧的结果。
比如你实验里的1 and 2,1是真值,所以直接返回右边的2;234324 and 22343243242同理,左侧是真值,返回右侧的长整数(Python2里长整数会带L标记)。or的规则:同样先判断左侧,要是左侧是真值,直接返回左侧结果;只有左侧是假值时,才返回右侧结果。
你最后一个实验1 or 2 and 9,还要注意运算符优先级:and的优先级比or高,所以先计算2 and 9得到9,再计算1 or 9——1是真值,所以直接返回1。
关于布尔值的数值运算
你提到的True + True得到2,是因为Python里布尔类型是整数的子类,True等价于1,False等价于0,所以可以像整数一样做算术运算,但这和and/or的行为完全是两码事,and/or不会把结果转换成布尔值再运算,而是直接返回表达式的原始值。
内容的提问来源于stack exchange,提问作者oyed




