我注意到 Python 2.7 逻辑表达式的一个奇怪行为:
>>> 0 和假 0 >>> 假和 0 错误的 >>> 1 和错误 错误的 >>> 假和 1 错误的
并用 True 代替 False
>>> 0 和真 0 >>> 真和 0 0 >>> 1 和真 真的 >>> 真和 1 1
Python将逻辑语句转换为整数时有什么规则吗?为什么有时会显示 0 insted of False 和 1 insted of True?
更何况,它为什么会返回这个?
>>>“测试”或“测试” '测试'
我注意到 Python 2.7 逻辑表达式的一个奇怪行为:
>>> 0 和假 0 >>> 假和 0 错误的 >>> 1 和错误 错误的 >>> 假和 1 错误的
并用 True 代替 False
>>> 0 和真 0 >>> 真和 0 0 >>> 1 和真 真的 >>> 真和 1 1
Python将逻辑语句转换为整数时有什么规则吗?为什么有时会显示 0 insted of False 和 1 insted of True?
更何况,它为什么会返回这个?
>>>“测试”或“测试” '测试'
没有任何东西被转换;Python 布尔逻辑运算符改为short circuit。
请参阅布尔运算符文档:
表达式
x and y首先计算x; 如果x为假,则返回其值;否则,y评估并返回结果值。表达式
x or y首先计算x; 如果x为真,则返回其值;否则,y评估并返回结果值。
此外,等于 的数字0被认为是错误的,空字符串和容器也是如此。引用同一文件:
在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:
False,None, 所有类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。
结合这两种行为意味着对于0 and False,0被认为是假的,并在评估False表达式之前返回。对于表达式True and 0,True被评估并发现是一个真值,所以0返回。就ifandwhile和其他布尔运算符而言,该结果0也被认为是错误的。
您可以使用它来提供默认值,例如:
foo = bar or 'default'
要将非布尔值真正转换为布尔值,请使用bool()type ; 它使用与布尔表达式相同的规则来确定输入的布尔值:
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool([])
False
>>> bool(True and 0)
False
>>> bool(1)
True
为了完成图片,在布尔上下文中不被认为是假的值被认为是真,包括任何自定义类。你可以通过在你的类上实现一个.__nonzero__()特殊的方法来改变它。如果没有定义这样的方法,.__len__()也请参考。使用这两种方法中的任何一种,您都可以表明您的类型是数字的,True如果非零则应被考虑,或者它是一个容器,True如果不为空(长度超过 0)则应被考虑。
Python 总是返回一个操作数对象
and返回第一个“假”对象或最后一个“真”对象。
or返回第一个“真”对象或最后一个“假”对象。
请注意,所有0, 0.0, False,""都被视为“假”。
>>> "a" and "b" and "c"
'c'
>>> "a" or "b" or "c"
'a'
那是因为0is s 虚假值本身。
>>> bool(0)
False
>>> bool(1)
True
0 and True是0因为0是ANDFalsy ,一旦找到第一个 falsy 值并返回该值,条件就会停止执行。如果所有值都为 True,则返回最右边的值。
OR将继续检查值,直到True找不到第一个值,否则它返回最后一个值。(最右边)
来自docs:
可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下值被认为是错误的:
没有任何
错误的
任何数字类型的零,例如
0, 0L, 0.0, 0j.任何空序列,例如
'', (), [].任何空映射,例如
{}.用户定义类的实例,如果该类定义了一个
__nonzero__()或__len__()方法,当该方法返回整数零或布尔值 False。
所有其他值都被认为是真的——所以许多类型的对象总是真的。
除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0 或 False 表示假,1 或 True 表示真。(重要的例外:布尔运算 or 和 and 总是返回它们的操作数之一。)